sql >> データベース >  >> RDS >> Mysql

JDBCでのJTableへのデータ呼び出しを最適化する

    悪いパフォーマンスの根本は、データベースに複数回クエリを実行して、必要なデータ(列、行、行番号、列番号など)を取得することです。

    列番号を取得するには:

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

    解決方法

    データベースを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. 結合されたテーブルで特定の条件を満たさないすべてのレコードを選択します

    2. SQL Server:where句を含む複数行のSUM()

    3. MySQLに保持されているキーやその他の構造機能を使用してテーブルを複製するにはどうすればよいですか?

    4. Excelを超えた5つの兆候