資料庫連線池介紹
如果是自行取得資料庫連線,每次都要載入Connection、使用者驗證、建立連線等動作,Connection開開關關的會相當沒有效率,在單機上也許感覺差別不大,但是對於Web應用程式,需要服務的人數多的情況下,效率的問題就會被突顯出來。
您可以預先建立好一定數量的Connection並儲存在一個池(Pool)中,在需要的時候從池中取得Connection,不需要的時候將
Connection放回池中,如此就可以重複利用Connection,而不用浪費時間在Connection的重新載入與開關。
Connection放回池中,如此就可以重複利用Connection,而不用浪費時間在Connection的重新載入與開關。
DBCP的使用
目前已經有許多設計好的連線池元件可以直接取得使用,而不用您重新設計一個連線池,在Tomcat中帶有DBCP連線池,您可以直接利用它來使用連線池,取得資源的方法是通過JNDI(Java
Naming and Directory Interface),不過您只要瞭解設定方式即可,這只是一些Key in的動作且並不困難。
Naming and Directory Interface),不過您只要瞭解設定方式即可,這只是一些Key in的動作且並不困難。
首先您必須交JDBC驅動程式放在Tomcat的common/lib下,然後編輯conf/server.xml,在<Host>與</Host>之間加入以下的內容
server.xml
…
<!– 應用程式目錄是JSP –>
<Context
path=”/JSP” docBase=”JSP”>
path=”/JSP” docBase=”JSP”>
<!– 使用資料庫名稱是 GUESTBOOK –>
<Resource
name=”jdbc/GUESTBOOK” scope=”Shareable”
type=”javax.sql.DataSource”/>
name=”jdbc/GUESTBOOK” scope=”Shareable”
type=”javax.sql.DataSource”/>
<ResourceParams
name=”jdbc/GUESTBOOK”>
name=”jdbc/GUESTBOOK”>
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!– DBCP database connection
settings –>
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 pooling options –>
<!– 等待Connection的時間,單位ms,-1表不限制 –>
<parameter>
<name>maxWait</name>
<value>3000</value>
</parameter>
<!– 連線池中最多可idle的Connection數,也就是最少的Connection數,0表不限制 –>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<!– 連線池至多的Connection數,0表示不限制 –>
<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>
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();
InitialContext();
Context envContext = (Context)initContext.lookup(“java:/comp/env”);
DataSource ds =
(DataSource)envContext.lookup(“jdbc/GUESTBOOK”);
(DataSource)envContext.lookup(“jdbc/GUESTBOOK”);
Connection conn =
ds.getConnection();
ds.getConnection();
下面這個JSP程式是個簡單測試通過連線池取得連線的例子
test.jsp
<%@page
import=”java.sql.*”%>
import=”java.sql.*”%>
<%@ page
import=”javax.sql.*” %>
import=”javax.sql.*” %>
<%@ page
import=”javax.naming.*” %>
import=”javax.naming.*” %>
<%@page
contentType=”text/html;charset=gb2312 “%>
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();
ds.getConnection();
if(!conn.isClosed())
out.println(“資料庫連線測試成功!“);
conn.close();
}
catch(SQLException
e) {
e) {
out.println(e.toString());
}
%>