Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zoptymalizuj połączenia danych w JDBC na JTable

IMHO głównym źródłem złej trwałości jest niepotrzebne zapytanie bazy danych wiele razy, aby uzyskać potrzebne dane (kolumny, wiersze, liczba wierszy, liczba kolumn itp.):

Aby uzyskać numer kolumny:

ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);

Aby uzyskać numer wierszy:

ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);

Aby uzyskać wiersze (to najgorsze, ponieważ znajduje się w pętli):

data = stmt.executeQuery("SELECT " + columnName + " FROM " + tableName + " LIMIT " + j + ", " + 1);

Jak to rozwiązać

Wystarczy raz wysłać zapytanie do bazy danych. Pojedynczy ResultSet i powiązane ResultSetMetaData powinno wystarczyć do osiągnięcia celu. Dodatkowo, jak już sugerowano, użyj SwingWorker do wykonywania wywołań bazy danych w osobnym wątku. Na przykład:

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. Format daty MySQL

  2. mysql - Tworzenie wierszy a wydajność kolumn

  3. Dlaczego funkcja LEFT JOIN w MySQL zwraca rekordy NULL, gdy zawiera klauzulę WHERE?

  4. Hibernacja:Zakleszczenie podczas próby uzyskania blokady

  5. Jak skonfigurować zdalne połączenie MySQL