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