NGUỒN GỐC của sự vĩnh viễn không hợp lệ là bạn truy vấn cơ sở dữ liệu nhiều lần một cách không cần thiết để lấy dữ liệu (cột, hàng, số hàng, số cột, v.v.) bạn cần:
Để lấy số cột:
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
Để lấy số hàng:
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
Để lấy các hàng (đây là lỗi tồi tệ nhất vì nó nằm trong một vòng lặp):
data = stmt.executeQuery("SELECT " + columnName + " FROM " + tableName + " LIMIT " + j + ", " + 1);
Cách giải quyết nó
Chỉ cần truy vấn cơ sở dữ liệu một lần. Một ResultSet
và ResultSetMetaData
được liên kết của nó đủ để hoàn thành mục tiêu của bạn. Thêm vào đó, và như đã được đề xuất, hãy sử dụng SwingWorker
để thực hiện các cuộc gọi cơ sở dữ liệu trong một chuỗi riêng biệt. Ví dụ:
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();