數(shù)據(jù)源(Data Source)為了減少數(shù)據(jù)庫的連接信息和一些邏輯名稱寫在JSP的源代碼中,JDBC2.0提供的一個接口叫做DataSource。
連接池(Connection Pool)對于應用程序來說為了防止應用程序多次連接和斷開數(shù)據(jù)庫所耗費的時間和資源,可采用數(shù)據(jù)連接池的方式減少資源的消耗。即一次向數(shù)據(jù)庫請求很多的connection。存儲在一個Pool中,讓需要的人從吃重取得Connection,等到用完了后在放回到數(shù)據(jù)池中。這樣提供了一個緩沖區(qū),讓JSP和數(shù)據(jù)庫之間得到最大的執(zhí)行效率。
JNDI(Java Naming and Directory Interface)提供一個接口是用戶可在不知道資源所在位置的情形之下獲得服務。
在 Tomcat 5.X的conf目錄下面找一個server.xml文件在里面配置數(shù)據(jù)連接池。在文件里面加入如下編碼:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/TollSystemModel" docBase="TollSystemModel" debug="0"
reloadable="true" crossContext="true">
<Resource name="jdbc/TollSystemModel" auth="Container"
type="javax.sql.DataSource"
driverClassName="org.gjt.mm.mysql.Driver"
maxIdle="30"
maxWait="1000"
username="root"
password="hacker"
url="jdbc:mysql://localhost:3306/toll_system"
maxActive="4"
autoReconnect="true"/>
</Context>
</Host>
說明:TollSystemModel是你的war包名稱或者是你在webapps/創(chuàng)建的目錄名稱
jdbc/TollSystemModel中的TollSystemModel是連接數(shù)據(jù)源名稱
toll_system是數(shù)據(jù)庫名稱
下面是用來開發(fā)數(shù)據(jù)源的JavaBean。即ConnectionBean.java。利用JNDI獲取數(shù)據(jù)源,等待用戶使用。
package ConnectDatabaseBean;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class ConnectionBean {
private DataSource ds=null;
public ConnectionBean()
{
//通過JNDI獲得數(shù)據(jù)源
try {
InitialContext ctx=null;
ctx = new InitialContext();
ds=(DataSource)ctx.lookup("java:comp/env/jdbc/TollSystemModel");
} catch (NamingException e) {
e.printStackTrace();
}
}
public Connection getConnection()
{
//獲取連接
try{
return ds.getConnection();
}
catch(SQLException sqle)
{
System.err.println("cant‘t get Connection from data source");
sqle.printStackTrace();
return null;
}
}
}
下面是封裝的數(shù)據(jù)庫操作的一些方法。即ConnectionHold.java,自行定義了一些transaction和執(zhí)行的SQL程序代碼,便于管理。
package ConnectDatabaseBean;
import java.sql.*;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class ConnectionHolder implements HttpSessionBindingListener{
private Connection connection=null;
private Statement stmt=null;
public ConnectionHolder(){
}
public void commit() throws SQLException{
connection.commit();
}
public ResultSet executeQuery(String sql) throws ClassNotFoundException, SQLException, Exception
{
return stmt.executeQuery(sql);
}
public int executeUpdate(String sql) throws ClassNotFoundException, SQLException, Exception
{
return stmt.executeUpdate(sql);
}
public void rollBack() throws ClassNotFoundException, SQLException, Exception
{
connection.rollback();
}
public void setAutoCommit(boolean ifAuto) throws SQLException
{
//可以設置是否自動提交
connection.setAutoCommit(ifAuto);
}
public void setConnection(Connection holdone)
{
connection=holdone;
try
{
stmt=connection.createStatement();
}
catch(SQLException sqle)
{
stmt=null;
}
}
public void valueBound(HttpSessionBindingEvent arg0) {
if(connection==null)
System.err.println("Didn‘t get Connection from Data Source!");
// 加入session的時候自動產(chǎn)生
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
try {
connection.close();
} catch (SQLException e) {
// session注銷時候調(diào)用,把連接放入池中
e.printStackTrace();
}
finally{
connection=null;
}
}
}
由于數(shù)據(jù)連接池的生命周期是整個應用程序,所以他們的范圍(scope)應該是application
下面是Jsp中如何引入連接池。
<jsp:useBean id="connectPool" class="ConnectDatabaseBean.ConnectionBean" scope="application"/>
<jsp:useBean id="connection" class="ConnectDatabaseBean.ConnectionHolder" scope="session">
<jsp:setProperty name="connection" property="connection" value=‘<%=connectPool.getConnection() %>‘/>
</jsp:useBean>