为什么应始终将连接池与Oracle XE一起使用
介紹
Oracle Express Edition是Oracle Enterprise Edition的免費(fèi)版本,其較小的尺寸使其非常方便地測(cè)試各種Oracle功能。
根據(jù)Oracle文檔 ,Express Edition最多可以使用一個(gè)CPU和1 GB RAM,但是實(shí)際上存在其他限制并不總是很明顯。
數(shù)據(jù)庫(kù)連接處理異常
以下測(cè)試試圖模擬低延遲的事務(wù)環(huán)境,因此租用了連接,但時(shí)間非常短:
private void simulateLowLatencyTransactions(DataSource dataSource, int waitMillis) throws SQLException {for (int i = 0; i < callCount; i++) {try {try (Connection connection = dataSource.getConnection()) {//Let's assume we are running a//short-lived transactionsleep(waitMillis);}} catch (SQLException e) {LOGGER.error("Exception on iteration " + i, e);}} }此測(cè)試可以正常工作,直到將等待時(shí)間降低到超過(guò)某個(gè)閾值為止,在這種情況下,數(shù)據(jù)庫(kù)偶爾會(huì)開始引發(fā)以下異常:
ERROR [main]: c.v.b.h.j.c.OracleConnectionCallTest - Exception on iteration 111 java.sql.SQLException: Listener refused the connection with the following error: ORA-12516, TNS:listener could not find available handler with matching protocol stackat oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:280) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:207) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:157) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]at com.vladmihalcea.book.high_performance_java_persistence.jdbc.connection.OracleConnectionCallTest.simulateLowLatencyTransactions(OracleConnectionCallTest.java:50) [test-classes/:na]at com.vladmihalcea.book.high_performance_java_persistence.jdbc.connection.OracleConnectionCallTest.testConnections(OracleConnectionCallTest.java:40) [test-classes/:na]盡管代碼是單線程的,但是Oracle開始抱怨連接請(qǐng)求偵聽器找不到用于處理傳入請(qǐng)求的進(jìn)程處理程序。
可以通過(guò)將流程和會(huì)話參數(shù)提高到更高的值來(lái)證明這一假設(shè):
alter system set processes=1000 scope=spfile; alter system set sessions=1000 scope=spfile;使用這些新設(shè)置,代碼可以正常運(yùn)行,并且不會(huì)發(fā)出異常。 盡管增加流程和會(huì)話限制可以解決問(wèn)題,但是此解決方案僅是一種解決方法,它只會(huì)提高連接閾值,而不能解決根本原因。
此IBM故障排除說(shuō)明給出了一種可能的解釋,建議連接關(guān)閉事件可能不會(huì)立即通知連接偵聽器。 這可能會(huì)導(dǎo)致連接偵聽器錯(cuò)誤地聲明實(shí)際的連接數(shù),并假定已經(jīng)達(dá)到最大進(jìn)程數(shù)。
在Oracle 11g企業(yè)版上,此問(wèn)題不可復(fù)制。
解決方法
精明的讀者在查看異常堆棧跟蹤時(shí)會(huì)注意到該問(wèn)題。 OracleDataSource不提供任何連接池機(jī)制 ,這導(dǎo)致大量連接在服務(wù)器端和驅(qū)動(dòng)程序這兩個(gè)驅(qū)動(dòng)程序上建立了開銷。
使用連接池解決了此問(wèn)題,因?yàn)檫B接被重用而不是按需建立。 連接池大大減少了連接獲取時(shí)間,這也導(dǎo)致了較低的事務(wù)等待時(shí)間和更好的吞吐量。
翻譯自: https://www.javacodegeeks.com/2015/08/why-you-should-always-use-connection-pooling-with-oracle-xe.html
總結(jié)
以上是生活随笔為你收集整理的为什么应始终将连接池与Oracle XE一起使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓车机音乐播放器哪个好(安卓车机音乐播
- 下一篇: glassfish_具有GlassFis