IMHO коренът на лошата перморманс е, че ненужно правите запитвания към базата данни няколко пъти, за да получите данните (колони, редове, номер на редове, номер на колони и т.н.), от които се нуждаете:
За да получите номера на колоните:
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
За да получите номера на редовете:
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
За да получите редове (това е най-лошото, защото е вътре в цикъл):
data = stmt.executeQuery("SELECT " + columnName + " FROM " + tableName + " LIMIT " + j + ", " + 1);
Как да го реша
Просто потърсете базата данни веднъж. Единичен ResultSet
и свързания с него ResultSetMetaData
трябва да е достатъчно, за да постигнете целта си. Освен това, както вече беше предложено, използвайте SwingWorker
да извършвате извиквания на база данни в отделна нишка. Например:
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();