[oracle]使用Oracle10g jdbc 驅(qū)動(dòng)中ConnectionCaching所產(chǎn)生的問(wèn)題
2024-08-29 13:33:09
供稿:網(wǎng)友
隱含連接緩存
在Oracle 數(shù)據(jù)庫(kù)10g 之前,JDBC 驅(qū)動(dòng)程序可提供連接緩存支持,然而
在可擴(kuò)展性、易用性和可治理性方面存在諸多限制。例如,所有對(duì)象均在
同一數(shù)據(jù)庫(kù)中,并作為同一用戶進(jìn)行鑒權(quán),而沒(méi)有清除失效連接的機(jī)制;
此外,由于所有對(duì)話均屬于同一數(shù)據(jù)庫(kù),并作為同一用戶進(jìn)行鑒權(quán),因此
根本無(wú)法存儲(chǔ)作為其它用戶進(jìn)行鑒權(quán)的連接。PRe-10g JDBC 驅(qū)動(dòng)程序緩存
治理不答應(yīng)連接緩存在可能失效時(shí)調(diào)整大小或刷新;不支持搜索連接或收
回所放棄的連接。這些缺點(diǎn)促使了對(duì)一種更完善的新型連接緩存機(jī)制“隱含
連接緩存”的需求。
隱含連接緩存可提供豐富的特性,包括:透明或隱含訪問(wèn)連接緩存,支持
存儲(chǔ)任何經(jīng)過(guò)鑒權(quán)的連接,能夠刷新或重復(fù)利用來(lái)自緩存的失效連接,支
持基于用戶定義的屬性的連接檢索、基于屬性和權(quán)重的連接檢索。透明訪問(wèn)連接緩存
通過(guò)缺省設(shè)置,DataSources 答應(yīng)獲得直接到數(shù)據(jù)庫(kù)的物理連接。利用“隱
含連接緩存“,通過(guò)簡(jiǎn)單將DataSource 屬性ConnectionCachingEnabled
指向true,便可從連接緩存獲得連接,始終使用同一標(biāo)準(zhǔn)getConnection()
API。這極大簡(jiǎn)化了DataSource 和連接緩存訪問(wèn)。其它所有事項(xiàng)均可選,
并可根據(jù)需求來(lái)執(zhí)行。例如,可以選定一組定義緩存行為的連接緩存屬性,
而不必使用缺省屬性。// Example to show binding of OracleDataSource to JNDI
// with relevant cache properties set on the DataSource.
…
// Set DataSource properties
ods.setUser(“Scott”);
…
ods.setConnectionCachingEnabled(True);
ods.setConnectionCacheName(“MyCache”);
ods.setConnectionCacheProperties(cp);
ctx.bind(“MyDS”, ods);
…
ods =(OracleDataSource) ctx. lookup(“MyDS”); // lookup cache DataSource
//Transparent creation and retrieval of connection(s) from “MyCache”
conn = ods.getConnection();
conn.close(); // return connection to the cache
…感謝Oracle10g jdbc driver帶來(lái)的令人激動(dòng)人心的特性,但是在實(shí)際的使用過(guò)程中,出現(xiàn)了下列問(wèn)題:
問(wèn)題描述: 在使用了setConnectionCachingEnabled(True); 語(yǔ)句后,我們發(fā)現(xiàn)當(dāng)程序在Cache模式運(yùn)行下
,假如這個(gè)時(shí)候?qū)?shù)據(jù)庫(kù)中的PLSQL的內(nèi)容進(jìn)行更改后,運(yùn)行程序訪問(wèn)這個(gè)PLSQL的話,會(huì)報(bào)出如下錯(cuò)誤:
(CSDN如何上傳圖片,faint)依次為ORA-06512,ORA-0650,ORA-04065,ORA-04061,ORA-04068,最后一個(gè)錯(cuò)誤是Package的狀態(tài)已經(jīng)被廢棄。經(jīng)過(guò)調(diào)查,發(fā)現(xiàn)
1。假如不使用Cache,不會(huì)出現(xiàn)這個(gè)問(wèn)題。
2。使用Cache,這個(gè)問(wèn)題會(huì)在不同的server上面在不同的一段時(shí)間間隔內(nèi)自動(dòng)消失。
3。假如不使用Cache,也無(wú)法使用Oracle提供的連接池功能。如最小的連接數(shù),初始化時(shí)所建立的連接數(shù)等。
4。不是所有的PLSQL的內(nèi)容變更后都出現(xiàn)這個(gè)問(wèn)題,只有PLSQL中包含有DB LINK的PLSQL才存在此問(wèn)題。解決篇:
根據(jù)2。使用Cache,這個(gè)問(wèn)題會(huì)在不同的server上面在不同的一段時(shí)間間隔內(nèi)自動(dòng)消失。
這個(gè)特性,從Cache的設(shè)定參數(shù)上進(jìn)行測(cè)試,終于發(fā)現(xiàn) 解決方法。
解決方法:
這段是Oracle的官方文檔
Connection Recycling Support
Over a period of time, connection cache accumulates stale connections. There are two modes for recycling or refreshing stale connections in the cache: REFRESH_INVALID_CONNECTIONS and REFRESH_ALL_CONNECTIONS.
• With REFRESH_INVALID_CONNECTIONS each PooledConnection in the cache is checked3; if invalid, the connection’s resources are removed and replaced with a new PooledConnection.
• WIth REFRESH_ALL_CONNECTIONS, all the available connections in the cache are closed and replaced with new valid physical connections.
3 The validity test is as simple as: select 1 from dual;程序中的設(shè)定:
在從data source中取得db連接之前調(diào)用如下這段話即可
OracleConnectionCacheManager.refreshCache(cache名,oracle.jdbc.pool.OracleConnectionCacheManager.REFRESH_INVALID_CONNECTIONS);總結(jié): 新技術(shù)伴隨著新風(fēng)險(xiǎn), 莫名其妙的問(wèn)題雖然解決了,但是 為什么是DBLINK,這其中的具體的產(chǎn)生原因又是什么呢?