的主要問題是,在具有多個數據庫連接多類AA大/大的Java項目,Java的如何管理一個大的Java項目數據庫連接
我們應該用一個全球性的單個連接到數據庫和運行它直到程序結束並在程序結束時關閉它或者 我們應該在需要時使用多個數據庫連接嗎? 這在安全性和易訪問性方面更好。
的主要問題是,在具有多個數據庫連接多類AA大/大的Java項目,Java的如何管理一個大的Java項目數據庫連接
我們應該用一個全球性的單個連接到數據庫和運行它直到程序結束並在程序結束時關閉它或者 我們應該在需要時使用多個數據庫連接嗎? 這在安全性和易訪問性方面更好。
更好交出連接管理像從官方文檔採取優勢Tomcat JDBC Pool.
列表中的一個連接池,
功能的加入了其他的連接池實現
1.Support高度併發環境和多核/ cpu系統。
2.接口的動態實現將支持運行時環境的java.sql和javax.sql接口(只要您的 JDBC驅動程序也這樣做),即使使用較低版本的JDK進行編譯時也是如此。
3.驗證時間間隔 - 我們不必驗證每次使用連接的時間,當我們借用或返回連接時,我們可以做到這一點,而不是比我們可以配置的時間間隔更頻繁。
4. 一次運行查詢,一個可配置的查詢,當與數據庫的連接建立時,該查詢只運行一次。對於 安裝會話設置非常有用,您希望在建立連接的整個時間 中存在設置。
5.能力配置自定義攔截器。這使您可以編寫自定義攔截器來增強功能。您可以使用 攔截器來收集查詢統計信息,緩存會話狀態,重新連接 發生故障時的連接,重試查詢,緩存查詢結果以及 等。您的選項是無窮無盡的,攔截器是動態的,而不是 綁定到JDK版本的java.sql/javax.sql接口。
6. 高性能 - 我們將展示一些性能差異以後
7.Extremely 簡單,由於非常簡單的實現,行數和源文件的數量是非常低的,比較用c3p0表示 有超過200個源文件(上次我們檢查過),Tomcat jdbc有一個 的8個文件核心,連接池本身大約是其中的一半。由於 可能會出現錯誤,因此它們將更快地追蹤並更容易修復。 減少複雜性一直是成立的焦點。
8. 異步連接檢索 - 您可以將您的請求排隊並接收Future連接。
9.Better 空閒連接處理。它不會直接關閉連接,而是可以集中連接並通過更智能的算法設置空閒池的大小。
10.您可以決定在什麼時候連接被認爲已放棄,是池滿時還是直接通過指定 池使用率閾值超時。
11. 放棄連接計時器將在語句/查詢活動時重置。允許長時間使用的連接不是 超時。這是通過使用ResetAbandonedTimer來實現的
12. 關閉連接連接了一段時間後。以年齡爲基礎關閉返回到游泳池。
13.獲取JMX通知以及懷疑連接被放棄時的日誌條目。這類似於 removeAbandonedTimeout,但它不採取任何行動,只報告 的信息。這是使用suspectTimeout屬性實現的。
14.可以從java.sql.Driver,javax.sql.DataSource或javax.sql.XADataSource中檢索連接。這可以通過使用 dataSource和dataSourceJNDI屬性來實現。
15。XA連接支持
樣品:
這裏是如何配置JNDI查找一個資源的例子。
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mysql"/>
在一個「大」項目中,我將使用應用程序容器爲我管理數據庫連接。 安全性不僅取決於與數據庫的連接。對我而言,這有點過分。如果設計存在缺陷,安全始終是個問題。 SQL注入。
我們應該使用一個全局的單連接數據庫並運行它,直到 程序結束並在程序結束時關閉它?
一般而言,在程序結束之前,不應該爲整個應用程序使用單個連接,這是一種不好的做法。
我們應該使用多個數據庫連接時需要它?**
是的,你需要使用多個連接和釋放,只要任務完成,即每一個連接對象,請務必關閉資源finally
塊或使用嘗試與資源,使他們不會創建任何連接泄漏。
數據庫連接的創建是昂貴的和企業應用程序,你需要去連接池,其被啓動時加載連接的具體數量,你將使用&回報從池中的連接。你可以看看here。
您的評估標準:*安全性*和*易用性**是**相反的**。但是,在這種情況下,請使用[*連接池*](https://github.com/brettwooldridge/HikariCP)並完成它。 –
謝謝@ elliott-frisch – Anshul