IMHO liegt die Wurzel der schlechten Leistung darin, dass Sie die Datenbank unnötigerweise mehrmals abfragen, um die Daten (Spalten, Zeilen, Zeilennummer, Spaltennummer usw.) zu erhalten, die Sie benötigen:
So erhalten Sie die Spaltennummer:
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
So erhalten Sie die Zeilennummer:
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
Um Zeilen zu erhalten (das ist das Schlimmste, weil es sich innerhalb einer Schleife befindet):
data = stmt.executeQuery("SELECT " + columnName + " FROM " + tableName + " LIMIT " + j + ", " + 1);
So lösen Sie es
Fragen Sie die Datenbank einfach einmal ab. Ein einzelnes ResultSet
und die zugehörigen ResultSetMetaData
sollte ausreichen, um dein Ziel zu erreichen. Verwenden Sie außerdem, wie bereits vorgeschlagen, einen SwingWorker
Datenbankaufrufe in einem separaten Thread durchzuführen. Zum Beispiel:
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();