Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Optimalkan panggilan data di JDBC ke JTable

IMHO akar dari kinerja buruk adalah Anda tidak perlu meminta database beberapa kali untuk mendapatkan data (kolom, baris, nomor baris, nomor kolom, dll) yang Anda butuhkan:

Untuk mendapatkan nomor kolom:

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

Untuk mendapatkan nomor baris:

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

Untuk mendapatkan baris (ini adalah yang terburuk karena berada di dalam satu lingkaran):

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

Bagaimana cara mengatasinya

Hanya query database sekali. Satu ResultSet dan ResultSetMetaData yang terkait harus cukup untuk mencapai tujuan Anda. Selain itu, dan seperti yang sudah disarankan, gunakan SwingWorker untuk melakukan panggilan database di utas terpisah. Misalnya:

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. Bagaimana membandingkan hanya tanggal dan tahun di php codeigniter

  2. MySql:MyISAM vs. Inno DB!

  3. Pengecualian Tak Terduga:SQLSTATE[HY000] [1045] Akses ditolak untuk pengguna ****@'localhost' (menggunakan kata sandi:YA)

  4. Tambahkan Kunci Asing ke tabel yang ada

  5. Pemahaman Gabung SQL Sederhana?