數據庫連接的建立和關閉是非常耗費系統資源的操作。數據庫連接池的解決方案是在應用程序啟動時建立足夠的數據庫連接,並將這些連接組成壹個連接池,由應用程序動態的對池中的連接進行申請、使用和釋放。對於多余連接池中的連接數的請求,應在請求隊列中排隊等待。並且應用程序會根據連接的使用率動態的增加和減少池中的連接數。
連接池技術盡可能多的重用了消耗內存的資源,大大節省了內存,提高了服務器的效率。
不同的版本的tomcat創建連接池的方法是不同的。下面基於tomcat5.5 + MS sql server 2k來說明。
step1:數據庫驅動(三個jar)放到$tomcat$/common/lib中。
step2:打開$tomcat$/conf/server.xml,在host下加入如下代碼
以下是引用片段:
<Context path="" docBase="D:\myelipseJsp\dsideal\WebRoot" reloadable="true">
<Resource
name="jdbc/xxx"
type="javax.sql.DataSource"
username="sa"
password=""
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=database"
maxActive="300"
maxIdle="100"
maxWait="5000"
removeAbandoned="true"
removeAbandonedTimeout="100"
logAbandoned="true"
/>
</Context>
註:在tomcat6.0下,需要在Resource中加入壹句auth="Container"即可。
maxActive是最大激活連接數,這裏取值為300,表示同時最多有300個數據庫連接。
maxIdle是最大的空閑連接數,這裏取值為100,表示即使沒有數據庫連接時依然可以保持100空閑的連接,而不被清除,隨時處於待命狀態。
MaxWait是最大等待秒鐘數,這裏取值5000,表示5秒後超時,也可取值-1,表示無限等待,直到超時為止。
removeAbandoned="true"
removeAbandonedTimeout="100"
logAbandoned="true"
以上三句話也需要加入,其主要作用在於當並發用戶超過預定的連接後會有壹些連接因為等待而失效,要及時回收這些無效鏈接。100表示100秒。
在connpool.jsp中使用。
以下是引用片段:
<%@ page contentType="text/html; charset=utf-8" language="java" errorPage="" %>
<%@ page import="javax.naming.Context"%>
<%@ page import="javax.sql.DataSource"%>
<%@ page import="javax.naming.InitialContext"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/xxx");
Connection conn = ds.getConnection();
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from news";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第壹個字段內容為:<%=rs.getString(1)%> <br>
<%}%>
<%out.print("數據庫操作成功,恭喜妳");%>
<%rs.close();
stmt.close();
conn.close();
%>
註意兩段代碼中的jdbc/xxx為連接池的名字,要保持壹致。
當然我們也可以將連接封裝起來,作為壹個類使用。結合我們以前所講的dataconn.java,這裏我將它們合並為壹個類。代碼如下:
以下是引用片段:
package dataconn;
import java.sql.*;
import javax.naming.*;
import javax.sql.DataSource;
public class dataconn{
ResultSet rs = null;
Connection conn=null;
Statement stmt=null;
//連接池
public static synchronized Connection getConnection() throws Exception
{
try
{
Context initCtx = new javax.naming.InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/xxx"); ;
return ds.getConnection();
}
catch(SQLException e)
{
throw e;
}
catch(NamingException e)
{
throw e;
}
}
//更新數據
public void executeUpdate(String sql) {
try {
conn = getConnection();
}
catch (Exception ex) {
ex.printStackTrace();
}
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate(sql);
}
catch(SQLException ex) {
System.err.println("aq.executeUpdate: " + ex.getMessage());
System.err.println("aq.executeUpadatestrSQL: " + sql);
}
}
//查詢數據
public ResultSet executeQuery(String sql) {
rs = null;
try {
conn = getConnection();
}
catch (Exception ex) {
ex.printStackTrace();
}
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println("aq.executeQuery: " + ex.getMessage());
System.err.println("aq.executeQuerystrSQL: " + sql);
}
return rs;
}
public void closeStmt()
{
try{
if(stmt!=null){
stmt.close();
}
}
catch(SQLException e){
e.printStackTrace();
}
}
public void closeConn()
{
try{
if (conn!=null){
conn.close();
}
}
catch(SQLException e){
e.printStackTrace();
}
}
}
此外妳要保證妳的sqlserver數據庫是好用的才行,用這個測試壹下
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=data_2007";
String user="sa";
String password="sa";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from userlist";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第壹個字段內容為:<%=rs.getString(1)%> <br>
您的第二個字段內容為:<%=rs.getString(2)%> <br>
您的第三個字段內容為:<%=rs.getString(3)%> <br>
<%}%>
<%out.print("數據庫操作成功,恭喜妳");%>
<%rs.close();
stmt.close();
conn.close();
%>
將上面代碼另存為.jsp,註意修改數據庫名,用戶名和密碼,即可測試sql server是否安裝成功。