數據庫連接是一種關鍵的有限的昂貴的資源,這在多用戶網頁應用程序中體現的尤為突出.對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標,數據庫連接池正是針對這個問題提出的.
數據庫連接池負責分配,管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏,這樣可以明顯提高對數據庫操作的性能.
數據庫連接池在初始化的時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是又最小數據庫連接數來設定的,無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這麼多的連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中.
數據庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素:
1.最小連接數是連接池一直保持的數據庫連接,所以如果應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費.
2.最大連接數是連接池申請的最大連接數,如果數據庫連接請求超過次數,後面的數據庫連接請求將被加入到等待對了中,這回影響之後的數據庫操作
如果最小連接數與最大連接數相差太大,那麼最先的連接請求將會獲利,之後超過最小連接數量的連接請求等價於建立一個新的數據庫連接,不過,這些小於最小連接數的數據庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閒超時被釋放.
實例使用的Tomcat版本為6.0
方法一: 在Tomcat的conf/context.xml中配置
在Tomcatapache-tomcat-6.0.33conf目錄下的context.xml文件中配置默認值如下:
<?xml version='1.0' encoding='utf-8'?> <Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context>
配置連接池:
<?xml version='1.0' encoding='utf-8'?>
<Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!--配置oracle數據庫的連接池--> <Resource name="jdbc/oracleds" author="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="scott" password="tiger" driverClassName="oracle.jdbc.dirver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:ora9" /> <!--配置mysql數據庫的連接池, 需要做的額外步驟是將mysql的Java驅動類放到tomcat的lib目錄下 maxIdle 連接池中最多可空閒maxIdle個連接 minIdle 連接池中最少空閒maxIdle個連接 initialSize 初始化連接數目 maxWait 連接池中連接用完時,新的請求等待時間,毫秒 username 數據庫用戶名 password 數據庫密碼 --> <Resource name="jdbc/mysqlds" auth="Container" type="javax.sql.DataSource" username="root" password="root" maxIdle="30" maxWait="10000" maxActive="100" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/db_blog" /> </Context>
配置好後需要注意的兩個步驟
1.將對應數據庫的驅動類放到tomcat的lib目錄西安
2.重新啟動tomcat服務器,讓配置生效
在web應用程序的web.xml中設置數據源參考,如下:
在<web-app></web-app>節點中加入下面內容
<resource-ref>
<description>mysql數據庫連接池</description> <!-- 參考數據源名字,同Tomcat中配置的Resource節點中name屬性值"jdbc/mysqlds"一致 --> <res-ref-name>jdbc/mysqlds</res-ref-name> <!-- 資源類型 --> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref>
錯誤解決:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) at javax.naming.InitialContext.getUR