À 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();