2

我正在使用 Java GUI 程序来更新 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 表基本上是具有几列和一行的配置信息,因此该函数获取列和更新值并相应地更新项目。该功能正常工作,它真的很慢......

使用经过的时间,我的平均更新时间约为 550 毫秒左右,最短时间为 294 毫秒,最长为 986 毫秒。有什么方法可以加快这个过程吗?

4

2 回答 2

3

如果您使用连接池中的连接会更快。您不必在每次访问数据库时都建立和关闭连接,这会花费很多时间。

Pierre 提到的 PreparedStatements 也会有所帮助,但在数据库作业上花费的大部分时间是建立/释放数据库连接问题。

于 2012-07-20T12:46:42.660 回答
2

使用一个主连接(初始化一次)和一个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 回答