Mysql
 sql >> Base de données >  >> RDS >> Mysql

Optimiser les appels de données dans JDBC vers JTable

À mon humble avis, la racine de la mauvaise performance est que vous interrogez inutilement la base de données plusieurs fois pour obtenir les données (colonnes, lignes, nombre de lignes, nombre de colonnes, etc.) dont vous avez besoin :

Pour obtenir le numéro des colonnes :

ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);

Pour obtenir le nombre de lignes :

ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);

Pour obtenir des lignes (c'est le pire car c'est à l'intérieur d'une boucle) :

data = stmt.executeQuery("SELECT " + columnName + " FROM " + tableName + " LIMIT " + j + ", " + 1);

Comment le résoudre

Il vous suffit d'interroger la base de données une seule fois. Un seul ResultSet et son ResultSetMetaData devrait suffire à atteindre votre objectif. De plus, et comme déjà suggéré, utilisez un SwingWorker pour effectuer des appels de base de données dans un thread séparé. Par exemple :

final JTable table = new JTable();

SwingWorker<Void, TableModel> worker = new SwingWorker<Void, TableModel> () {

    @Override
    protected Void doInBackground() throws Exception {

        ResultSet resultSet = stmt.executeQuery("SELECT * FROM " + tableName);
        ResultSetMetaData metaData = resultSet.getMetaData();

        int columnCount = metaData.getColumnCount(); // columns number
        String[] columnNames = new String[columnCount];
        for (int i = 1; i <= columnCount; i++) {
            columnNames[i] = metaData.getColumnName(i); // fill columns names
        }

        resultSet.last();
        int rowCount = resultSet.getRow(); // get rows number
        resultSet.beforeFirst();

        Object[][] data = new Object[rowCount][columnCount];
        int currentRow = 0;
        while (resultSet.next()) {
            for (int currentColumn = 1; currentColumn <= columnCount; currentColumn++) {
                data[currentRow][currentColumn - 1] = resultSet.getObject(currentColumn); // fill data set
             }
             currentRow++;
        }

        TableModel model = new DefaultTableModel(data, columnNames);
        publish(model);

        return null;
    }

    @Override
    protected void process(List<TableModel> chunks) {
        TableModel model = chunks.get(0);
        table.setModel(model);
    }
}

worker.execute();