Tomcat連接池


步驟1:

找到Tomcat安裝目錄下的context.xml文件,在config目錄下。在<Context/>節點下加入:

    <Resource name="jdbc/mytest" 
        auth="Container" type="javax.sql.DataSource"  maxActive="100"  
        maxIdle="10" maxWait="-1"   username=""   password="" 
        driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
        url="jdbc:sqlserver://127.0.0.1;DatabaseName=PPMOld;integratedSecurity=True;"/>


步驟2:

將原來的Connection代碼對象例如:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1;DatabaseName=PPMOld;integratedSecurity=True;");

修改為:

Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/mytest");
Connection conn = ds.getConnection();

步驟3:

重啟Tomcat即可。


 

資料說還要在web.xml里加入一段代碼:

 <resource-ref>
     <res-ref-name> jdbc/mytest</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
 </resource-ref>

經測試這段代碼不加也沒有問題。


 

參數說明:

•相關參數說明:
•dataSource: 要連接的 datasource (通常我們不會定義在 server.xml) 
defaultAutoCommit: 對於事務是否 autoCommit, 默認值為 true 
defaultReadOnly: 對於數據庫是否只能讀取, 默認值為 false 
driverClassName:連接數據庫所用的 JDBC Driver Class, 
maxActive: 可以從對象池中取出的對象最大個數,為0則表示沒有限制,默認為8 
maxIdle: 最大等待連接中的數量,設 0 為沒有限制 (對象池中對象最大個數) 
minIdle:對象池中對象最小個數 
maxWait: 最大等待秒數, 單位為 ms, 超過時間會丟出錯誤信息,-1為無限制
password: 登陸數據庫所用的密碼 
url: 連接數據庫的 URL 
username: 登陸數據庫所用的帳號 
validationQuery: 驗證連接是否成功, SQL SELECT 指令至少要返回一行 
removeAbandoned: 是否自我中斷, 默認是 false 
removeAbandonedTimeout: 幾秒后會自我中斷, removeAbandoned 必須為 true 
logAbandoned: 是否記錄中斷事件, 默認為 false 
minEvictableIdleTimeMillis:大於0 ,進行連接空閑時間判斷,或為0,對空閑的連接不進行驗證;默認30分鍾 
timeBetweenEvictionRunsMillis:失效檢查線程運行時間間隔,如果小於等於0,不會啟動檢查線程,默認-1 
testOnBorrow:取得對象時是否進行驗證,檢查對象是否有效,默認為false 
testOnReturn:返回對象時是否進行驗證,檢查對象是否有效,默認為false 
testWhileIdle:空閑時是否進行驗證,檢查對象是否有效,默認為false 
Ø 在使用DBCP的時候,如果使用默認值,則數據庫連接因為某種原因斷掉后,再從連接池中取得連接又不進行驗證,這時取得的連接實際上就會是無效的數據庫連接。因此為了防止獲得的數據庫連接失效,在使用的時候最好保證: 
username: 登陸數據庫所用的帳號 
validationQuery:SELECT COUNT(*) FROM DUAL 
testOnBorrow、testOnReturn、testWhileIdle:最好都設為true 
minEvictableIdleTimeMillis:大於0 ,進行連接空閑時間判斷,或為0,對空閑的連接不進行驗證 
timeBetweenEvictionRunsMillis:失效檢查線程運行時間間隔,如果小於等於0,不會啟動檢查線程 
Ø PS:在構造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也會使用GenericObjectPool]時,會生成一個內嵌類Evictor,實現自Runnable接口。如果 timeBetweenEvictionRunsMillis大於0,每過timeBetweenEvictionRunsMillis毫秒 Evictor會調用evict()方法,檢查對象的閑置時間是否大於minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小於等於0時則忽略,默認為30分鍾),是則銷毀此對象,否則就激活並校驗對象,然后調用 ensureMinIdle方法檢查確保池中對象個數不小於_minIdle。在調用returnObject方法把對象放回對象池,首先檢查該對象是否有效,然后調用PoolableObjectFactory的passivateObject方法使對象處於非活動狀態。再檢查對象池中對象個數是否小於 maxIdle,是則可以把此對象放回對象池,否則銷毀此對象 
Ø 上述特性的可設置性已在代碼中驗證,具體性能是否能實現有待實際驗證 

在Tomcat的Server.xml,我們可以看看下面的這個例子: 

<Resource name="lda/raw" 
              type="javax.sql.DataSource" 
               password="lda_master" 
               driverClassName="oracle.jdbc.driver.OracleDriver" 
               maxIdle="30" minIdle="2" maxWait="60000" maxActive="1000" 
               testOnBorrow="true" testWhileIdle="true" validationQuery="select 1 from dual" 
               username="lda_master" url="jdbc:oracle:thin:@192.160.100.107:15537:lcststd"/> 

這樣的話,就可以避免產生Connection Reset的錯誤了. 

這樣一來,就能夠解決Connect Reset的問題了。剛才說了,其實很多App Server都會有相應的配置地方,只是大型的服務器正好提供了Admin Console,上面可以顯式的配置Connection Pool,也有明顯的屬性選擇。
•值得一提的是,
•removeAbandoned: 是否自我中斷, 默認是 false 
removeAbandonedTimeout: 幾秒后會自我中斷, removeAbandoned 必須為 true 
logAbandoned: 是否記錄中斷事件, 默認為 false 
這三個屬性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM