2011-08-21 215 views
1

我們在基於Windows桌面的Java應用程序上使用SQLite(Xerial JDBC驅動程序)。現在我們轉到同一應用程序的客戶端 - 服務器版本,其中多個基於Java的Swing客戶端將連接到指定服務器Windows PC上的相同SQLite數據庫文件。請糾正我,如果我錯了:在網絡共享上使用sqlite

  1. 是保持SQLite數據庫文件通過網絡共享唯一的選擇在這種模式下使用SQLite?還是有一些其他的解決方案,我失蹤了?
  2. 使用SQLite會增加數據庫損壞的機率嗎?

我沒有看到很多併發更新操作。將有5-10個客戶端嘗試讀取&更新相同的數據庫。在那種情況下,使用entperise grade DB(MySQL,Postgres)更好嗎?

+0

看看這個問題的答案(http://stackoverflow.com/questions/1321493/sqlite-for-client-server)。你使用什麼版本的SQLite? –

回答

2

從FAQ款前one quoted

的SQLite使用讀/寫鎖來控制對數據庫的訪問。 (在Win95/98/ME中,缺少對讀寫器鎖定的支持,而是使用概率模擬代替 )。但請注意:如果數據庫文件保留在NFS文件系統上,則此鎖定機制可能無法正常工作。這是因爲fcntl()文件鎖定在許多NFS實現上破壞了 。如果多個進程可能嘗試同時訪問 文件,則應避免將SQLite 數據庫文件放在NFS上。在Windows上,Microsoft的文檔說如果您沒有運行 Share.exe守護進程, 鎖定可能無法在FAT文件系統下工作。對Windows 有很多經驗的人告訴我,網絡文件的文件鎖定非常麻煩,並且不是 可靠的。如果他們說的是真的,在兩臺或多臺Windows機器之間共享SQLite數據庫 可能會導致意外問題。

我不會網絡共享一個SQLite數據庫文件,因爲它看起來你會買自己討厭的同步問題,很難再現數據損壞。

換言之,您正在使用通用文件共享機制來替代另一個DBMS的服務器功能。對於多個客戶端訪問,這些其他DBMS經過專門測試和現場強化,儘管SQLite具有很大優點,但這不是其中之一。

0

這是一個FAQ

[...]我們都知道, 能支持的併發性SQLite的任何其他嵌入式SQL數據庫引擎的。 SQLite允許多個 進程一次打開數據庫文件,並允許多個進程一次讀取數據庫。當任何進程想要寫入 時,它必須鎖定整個數據庫文件的更新期限爲 。但通常只需要幾毫秒。其他 進程只是等待作家完成,然後繼續他們的 業務。其他嵌入式SQL數據庫引擎通常只允許單個進程同時連接到數據庫。 [...]

也讀SQLite is serverless

SQLite是否足以滿足您的需求是不可能的。如果您有長時間運行的更新事務,則鎖定整個數據庫可能是一個嚴重問題。由於您使用JDBC來訪問它,所以如果有必要,切換到另一個數據庫引擎時應該不會有太多問題。