Mysql
 sql >> база данни >  >> RDS >> Mysql

Оптимизирайте извикването на данни в JDBC в JTable

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изтрия mysql ред след изтичане на времето?

  2. Как да конвертирате малки букви в главни в MySQL

  3. Как да разположите Chamilo MySQL база данни за висока наличност

  4. Как да поръчам MySQL заявка по конкретна колона?

  5. Google Maps Запазва полигон и точки в MySQL с помощта на PHP