2012-07-20 71 views
2

我正在使用Java GUI程序更新SQlite数据库。我的Gui选项大多是带开/关值的切换按钮。由于Gui的特性,更新数据库的性能需要很快,因此控制可以快速返回到Gui调用函数。Java更新SQL数据库性能

我有下面的代码,它运行的每一个切换按钮选择时间:

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毫秒。有什么方法可以加快这个过程吗?

回答

3

如果您使用连接池中的连接,速度会更快。每次访问数据库时都不必建立和关闭连接,这需要很长时间。

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

+0

感谢您有用的答案。是的,我意识到连接是计算上最昂贵的部分。因此,我使用[本站]的示例实现了BoneCP Java数据库连接池(http://tunatore.wordpress.com/2011/11/07/how-to-use-bonecp-java-database-connection-pool- JDBC池库/)。现在我的帮助程序代码尝试使用conn = ConnectionManager.getConnection()来建立连接。问题是我的表现与现在的平均时间752(ms),最小262(ms)和最大2919(ms)基本相同。示例代码是否正确,或者我错过了什么? – 2012-07-24 12:36:06

+0

运行几个测试。首先执行代码需要更长时间(建立连接并将其添加到连接池),但后面的执行应该花费更少的时间。还执行准备好的声明。这也将有所帮助。 – 2012-07-24 12:46:24

+0

这就是诀窍,谢谢!平均下降到500毫秒,这接近可接受的水平。对于Java,Sqlite和BoneCP这种类型的操作以及我正在执行的写入类型,您会期待什么样的时间?只是好奇。 – 2012-07-24 13:11:28

2

使用一个主连接(初始化一次)和PreparedStatement

SQL语句进行预编译并存储在PreparedStatement对象 。然后可以使用此对象多次有效地执行此语句。

void updateDCStable(Connection conn,String item, int value) {(...) 
PreparedStatement ps = conn.prepareStatement("UPDATE DCS set "+ item +"= ?"); 
ps.setInt(1,value);