Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tối ưu hóa việc gọi dữ liệu trong JDBC vào JTable

NGUỒN GỐC của sự vĩnh viễn không hợp lệ là bạn truy vấn cơ sở dữ liệu nhiều lần một cách không cần thiết để lấy dữ liệu (cột, hàng, số hàng, số cột, v.v.) bạn cần:

Để lấy số cột:

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

Để lấy số hàng:

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

Để lấy các hàng (đây là lỗi tồi tệ nhất vì nó nằm trong một vòng lặp):

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

Cách giải quyết nó

Chỉ cần truy vấn cơ sở dữ liệu một lần. Một ResultSet ResultSetMetaData được liên kết của nó đủ để hoàn thành mục tiêu của bạn. Thêm vào đó, và như đã được đề xuất, hãy sử dụng SwingWorker để thực hiện các cuộc gọi cơ sở dữ liệu trong một chuỗi riêng biệt. Ví dụ:

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. Cách tốt để không chuẩn hóa cơ sở dữ liệu mysql là gì?

  2. Làm thế nào để lưu trữ varbinary trong MySQL?

  3. Chìa khóa duy nhất với NULL

  4. Mysql_real_escape_string có đủ để Anti SQL Injection không?

  5. Lỗi MySQL 1 (HY000) Sự cố khi tạo tệp Errcode 2