2015-09-14 61 views
1

上下文

我有一個使用JAX-RS,tomcat8和Neo4j嵌入式與格鬥遊戲的RESTful API。單身人士或連接池爲高perfs?

今天我發現很多查詢將在有限的時間內完成,我使用嵌入式查詢來加快查詢速度,但我仍想盡可能快地查詢。

問題

事實上,問題有點不同,但沒有那麼多。

其實,我正在使用一個單身人士與getDabatase()方法返回當前GraphDatabaseService實例開始一個事務,一旦完成,事務關閉......就這些了。

我不知道最佳perf的最佳解決方案是單例模式還是池模式(如創建數據庫連接的XX實例,並在數據庫操作完成時重用它們)。

我實際上不能測試它,因爲我沒有足夠的連接來知道哪一個是最快的(並且是最好的總體)。

另外,我想知道我是否創建了一個GraphDatabaseService實例池,它們是否都能夠訪問相同的數據而不會被鎖鎖住?

回答

2

板條箱只有一個GraphDatabaseService實例和使用它到處。沒有必要爲它們創建實例池。 GraphDatabaseService是完全線程安全的,所以你不必擔心併發性(注意:事務是線程綁定的,所以你不能在同一個線程中運行多個事務)。

Neo4j中的所有操作都應在Transaction中執行。提交事務寫入事務日誌中,然後保存到數據庫中。一般規則是:

  • 始終關閉交易儘早(使用try-與資源)
  • 關閉所有資源儘可能早地(ResourceIterator通過findNodes()返回並執行())

Here你可以找到關於鎖定策略的信息。


要確保你有最好的表現,你應該:

  • 檢查數據庫設置(內存映射)
  • 檢查操作系統設置(文件系統)
  • 檢查JVM設置(GC ,堆大小)
  • 數據模型

Here你可以找到一些關於Neo4j配置&優化的文章。他們都有有用的信息。

+0

好吧,比方說,我們有兩個球員在同一時間編輯他們的信息(很難做,但仍然有可能)。我的兩筆交易是否正確完成?我的意思是,你說你不能在同一個線程中運行多個事務,但是如果兩個POST查詢同時發生,我會得到異常嗎? – Supamiu

+0

沒有。如果使用Jersey(作爲JAX-RS實現),則每個POST請求都在單獨的線程中處理。 Jersey有內部線程池(可配置)。一切都應該順利。即使出現死鎖,Neo4j也有內置機制來解決它們(在這種情況下,您將收到'DeadlockException')。 – FylmTM

-1

使用游泳池 - 絕對。

創建數據庫連接通常非常昂貴。使用池將確保連接保持合理的時間並儘可能重新使用。

+0

但是,是不是Singleton更快呢?我的意思是如果你只創建一個GraphDatabseService,並且你在每個地方都使用相同的代碼,是不是更便宜?那麼neo4j的數據庫文件鎖定呢?我的意思是我們可以從GraphDatabaseService的不同實例訪問相同的數據嗎?我編輯的問題是更具體的 – Supamiu