2

JavaGUIプログラムを使用してSQliteデータベースを更新しています。私のGUIオプションは、ほとんどがオン/オフ値のあるトグルボタンです。GUIの性質上、データベースの更新のパフォーマンスは高速である必要があります。これにより、制御をGui呼び出し関数にすばやく戻すことができます。

次のコードがあります。これは、トグルボタンが選択されるたびに実行されます。

public static void updateDCStable(String item, int value)
{
    try {
        long start = System.currentTimeMillis();
        Class.forName("org.sqlite.JDBC");
        String url = DATABASE_FILEPATH; 
        Connection conn = DriverManager.getConnection(url);

        Statement update = conn.createStatement();           
        update.execute("UPDATE DCS "
                + "SET " + item + "='" + value + "';");

        update.close();
        conn.close();

        long time_elapsed = System.currentTimeMillis() - start;
        System.out.println("Changed DCS date item " + item + " to "
                + value + " in " + time_elapsed + "(ms)");
    } catch (SQLException ex) { /* Error handling */
    } catch (ClassNotFoundException ex) { /* Error handling */
    } 
}

私のSQLテーブルは基本的に、複数の列と1つの行だけの構成情報であるため、関数は列と更新値を取得し、それに応じてアイテムを更新します。この関数は正しく機能しますが、本当に遅いです。

経過時間を使用すると、平均更新時間は約550ミリ秒で、最小時間は294ミリ秒、最大時間は986ミリ秒です。このプロセスをスピードアップする方法はありますか?

4

2 に答える 2

3

接続プールからの接続を使用すると、より高速になります。データベースにアクセスするたびに接続を確立して閉じる必要はありません。これには多くの時間がかかります。

Pierre が言及した PreparedStatements も役立ちますが、データベース ジョブに費やされる時間の大半は、データベース接続の問題を確立/解放することです。

于 2012-07-20T12:46:42.660 に答える
2

1 つのメイン接続 (1 回初期化) とPreparedStatementを使用します。

SQL ステートメントはプリコンパイルされ、PreparedStatement オブジェクトに格納されます。このオブジェクトを使用して、このステートメントを複数回効率的に実行できます。

void updateDCStable(Connection conn,String item, int value) {(...)
PreparedStatement ps = conn.prepareStatement("UPDATE DCS set "+ item +"= ?");
ps.setInt(1,value);
于 2012-07-20T12:46:54.333 に答える