IMHO roden til den dårlige ydeevne er, at du unødigt forespørger databasen flere gange for at få de data (kolonner, rækker, rækkenummer, kolonnenummer osv.), du har brug for:
Sådan får du kolonnenummer:
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
Sådan får du rækkenummer:
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
For at få rækker (dette er det værste, fordi det er inde i en løkke):
data = stmt.executeQuery("SELECT " + columnName + " FROM " + tableName + " LIMIT " + j + ", " + 1);
Sådan løses det
Bare forespørg på databasen én gang. Et enkelt Resultatsæt
og dets tilknyttede ResultSetMetaData
burde være nok til at nå dit mål. Derudover, og som allerede foreslået, brug en SwingWorker
at lave databasekald i en separat tråd. For eksempel:
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();