資料庫連線池介紹

如果是自行取得資料庫連線,每次都要載入Connection、使用者驗證、建立連線等動作,Connection開開關關的會相當沒有效率,在單機上也許感覺差別不大,但是對於Web應用程式,需要服務的人數多的情況下,效率的問題就會被突顯出來。

 

您可以預先建立好一定數量的Connection並儲存在一個池(Pool)中,在需要的時候從池中取得Connection,不需要的時候將
Connection放回池中,如此就可以重複利用Connection,而不用浪費時間在Connection的重新載入與開關。

 

DBCP的使用

目前已經有許多設計好的連線池元件可以直接取得使用,而不用您重新設計一個連線池,在Tomcat中帶有DBCP連線池,您可以直接利用它來使用連線池,取得資源的方法是通過JNDI(Java
Naming and Directory Interface),不過您只要瞭解設定方式即可,這只是一些Key in的動作且並不困難。

 

首先您必須交JDBC驅動程式放在Tomcat的common/lib下,然後編輯conf/server.xml,在<Host>與</Host>之間加入以下的內容

server.xml

<!– 應用程式目錄是JSP –>

<Context
path=”/JSP” docBase=”JSP”>

    <!– 使用資料庫名稱是 GUESTBOOK –>

    <Resource
name=”jdbc/GUESTBOOK” scope=”Shareable”
type=”javax.sql.DataSource”/>

    <ResourceParams
name=”jdbc/GUESTBOOK”>

        <parameter>

            <name>factory</name>

           
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

        </parameter>

       

        <!– DBCP database connection
settings –>

        <!– JDBC URL
–>

        <parameter>

            <name>url</name>

            <value>jdbc:mysql://localhost/GUESTBOOK</value>

        </parameter>

       

<!– JDBC驅動程式 –>

        <parameter>

           
<name>driverClassName</name>

           
<value>com.mysql.jdbc.Driver</value>

        </parameter>

       

<!– 使用者名稱密碼 –>

        <parameter>

            <name>username</name>

           
<value>caterpillar</value>

        </parameter>

        <parameter>

            <name>password</name>

            <value>123456</value>

        </parameter>

       

<!– DBCP
connection pooling options –>

        <!– 等待Connection的時間單位ms-1表不限制 –>

        <parameter>

            <name>maxWait</name>

            <value>3000</value>

        </parameter>

       

<!– 連線池中最多可idleConnection也就是最少的Connection0表不限制 –>

        <parameter>

            <name>maxIdle</name>

            <value>10</value>

        </parameter>

       

<!– 連線池至多的Connection0表示不限制 –>

        <parameter>

            <name>maxActive</name>

            <value>100</value>

        </parameter>

    </ResourceParams>

</Context>

 

設定好後接下來設定Web應用程式的web.xml加入以下的內容

web.xml

     <resource-ref>

         <description>JNDI JDBC
DataSource</description> <res-ref-name>jdbc/GUESTBOOK</res-ref-name>        
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>

     </resource-ref>

 

這樣就可以使用DBCP連線池的功能了可以這麼取Connection

Context initContext = new
InitialContext();

Context envContext  = (Context)initContext.lookup(“java:/comp/env”);

DataSource ds =
(DataSource)envContext.lookup(“jdbc/GUESTBOOK”);

Connection conn =
ds.getConnection();

 

下面這個JSP程式是個簡單測試通過連線池取得連線的例子

test.jsp

<%@page
import=”java.sql.*”%>

<%@ page
import=”javax.sql.*” %>

<%@ page
import=”javax.naming.*” %>

<%@page
contentType=”text/html;charset=gb2312 “%>

<%

try {

    Context initContext = new InitialContext();

Context envContext = (Context)initContext.lookup(“java:/comp/env”);

DataSource ds = (DataSource)envContext.lookup(“jdbc/GUESTBOOK”);

Connection conn =
ds.getConnection();

    if(!conn.isClosed())

        out.println(“資料庫連線測試成功“);

        conn.close();

     }

     catch(SQLException
e) {

         out.println(e.toString());

     }

%>