2012-07-20 40 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);