Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Optimieren Sie den Datenaufruf in JDBC auf JTable

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