步驟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 這三個屬性。