sql >> Database teknologi >  >> RDS >> Mysql

Optimer dataopkald i JDBC til JTable

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



  1. Sådan nulstiller du MySQL root-adgangskoden

  2. Hvordan forespørges databasenavn i Oracle SQL Developer?

  3. Antal andre rækker i tabellen med samme værdi

  4. Hvordan tester man en SQL Update-sætning, før man kører den?