2017-05-26 60 views
0

我正在學習有關JDBC連接池,這聽起來很容易用JNDI得到DataSource實例:如何處理連接池和DAO?

DataSource ds = (DataSource)ctx.lookup("jdbc/myDB"); 

所有我發現顯示教程此代碼只有一個對象,但我的問題是如何使用DataSource當我有幾個DAO對象需要從數據庫中獲取數據。

  1. 它是確定對每一個新DAO對象的構造函數中使用上面的代碼,用於連接池?我認爲每次都會返回相同的DataSource,就像Dictionary Singleton會做的一樣,持有一個DataSource並返回它,或者我錯了,每次都會返回一個不同的DataSource並使用不同的池,從而破壞我的目的?

  2. 我應該認爲DataSource在辛格爾頓和只運行JNDI搜索一次或者是搜索開銷忽略不計,這是一個愚蠢的優化?

+0

你有沒有試過https://commons.apache.org/proper/commons-dbcp/或https://brettwooldridge.github.io/HikariCP/?它們提供開箱即用的連接池功能,無需重新編寫。對不起,可能不是你的問題的答案。只是想過讓你知道。祝你好運! – harshavmb

+0

我將使用tomcat 8內部的解決方案,但它根本不涉及這個問題,不過謝謝 – mFeinstein

回答

1
  1. 它是確定使用上面的連接池每個新DAO對象的構造函數的代碼?我認爲每次都會返回相同的DataSource,就像Dictionary Singleton會做的一樣,持有一個DataSource並返回它,或者我錯了,每次都會返回一個不同的DataSource並使用不同的池,從而破壞我的目的?

應該每次都返回相同的DataSource對象。如果它不是字面上相同的對象,那麼它應該至少共享相同的底層連接池。

  • 我應該認爲數據源在一個Singleton,只有運行JNDI查找一次或者是搜索開銷忽略不計,這是一個愚蠢的優化?
  • JNDI的搜索開銷相比,在遠程數據庫上執行操作是可以忽略不計,所以沒有必要緩存DataSource對象。

    +0

    人們是如何在DAO上使用它的?還是有其他一些着名的模式? – mFeinstein

    +0

    首先,我應該問,您是在Java EE應用服務器上運行還是不運行? –

    +0

    我在tomcat 8上運行...但爲什麼這很重要?這不應該與帶下劃線的平臺分離嗎? – mFeinstein