2012年8月20日 星期一

在 Java 中使用 SQLite Database

SQLite Database 是輕量級的關聯式資料庫
在過去要使用關聯式資料庫,都必須架設像是 MySQL、SQL Server 等等的大型資料庫系統
對於某些會被拿來拿去的移動式程式來說相當不合用
雖然有微軟的 Access 可以達到移動式資料庫的目的,但是 Access 本身並沒有索引的設計
效率不佳,能夠承受的同時使用人數也很少~
現在有了 SQLite Database,相對於 Access 提昇了不少效能
但在 Java 中並沒有內建 SQLite 的 JDBC driver,而 SQLite 官方也沒有提供
因此網路上可以找到很多各自發展的 SQLite JDBC driver。
這裡使用的 driver 是 Xerial 的 JDBC driver [1]
使用原因...看起來他更新比較頻繁,而且用的人好像比較多 XD

初始化
Xerial 的 JDBC driver 預設是建立 JDBC 連線時,如果資料庫檔案不存在,就會自動建立一個資料庫檔
所以初始化可以簡單地先檢查檔案是否存在,否的話建立資料庫連線以後就執行資料庫初始化的動作
或者乾脆先在別的地方先把已經初始化完成的資料庫備份起來,如果資料庫檔案不存在就把備份的空白資料庫貼過去。

public void init() {
  // Get the file path of the SQLite database.
  String pathOfDatabase = "/home/user/sqlite.db";
  try {
    // load the sqlite-JDBC driver using the current class loader
    Class.forName("org.sqlite.JDBC");
    // Initial the database connection.
    Connection SQLiteConnection = DriverManager.getConnection("jdbc:sqlite:" + pathOfDatabase);
  } catch (SQLException e) {
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }
}
上面的程式碼中,要注意的大概只有...import 的 package 是 java.sql.*。

效率
SQLite Database 是一個「輕量級」的資料庫,所以對於大量的 concurrent queries 的處理能力一定會比較弱
但要如何衡量目前的專案適不適合使用 SQLite 呢?
也許可以參考看看 [2] 的討論~目前我也還在研究這個問題....
[3] 有做了在 Java 上對 SQLite 插入資料的測試,然後整體結論是~SQLite 最好要把 Auto-Commit 關掉
所有的 Insert 動作都在記憶體裡面動作,累積到夠多了再一次 Commit 的效率會好超多!
反過來說,如果服務是沒辦法累積一堆 queries 以後再一次送出,必須每個每個單獨做
那也許就要好好思考 SQLite 的效能問題了。

參考資料:
1、Xerial SQLite JDBC driver
2、SQLite for client-server
3、Sqlite in Java. Performance

沒有留言: