数据源(Data Source)为了减少数据库的连接信息和一些逻辑名称写在JSP的源代码中,JDBC2.0提供的一个接口叫做DataSource。
连接池(Connection Pool)对于应用程序来说为了防止应用程序多次连接和断开数据库所耗费的时间和资源,可采用数据连接池的方式减少资源的消耗。即一次向数据库请求很多的connection。存储在一个Pool中,让需要的人从吃重取得Connection,等到用完了后在放回到数据池中。这样提供了一个缓冲区,让JSP和数据库之间得到最大的执行效率。
JNDI(Java Naming and Directory Interface)提供一个接口是用户可在不知道资源所在位置的情形之下获得服务。
5.2.3 Tomcat5.X数据连接池配置:
在 Tomcat 5.X的conf目录下面找一个server.xml文件在里面配置数据连接池。在文件里面加入如下编码:
<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/创建的目录名称
jdbc/TollSystemModel中的TollSystemModel是连接数据源名称
toll_system是数据库名称
5.2.4 开发数据源的JavaBean。
下面是用来开发数据源的JavaBean。即ConnectionBean.java。利用JNDI获取数据源,等待用户使用。
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获得数据源
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;
}
}
}
5.2.4 封装的SQL方法的JavaBean
下面是封装的数据库操作的一些方法。即ConnectionHold.java,自行定义了一些transaction和执行的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的时候自动产生
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
try {
connection.close();
} catch (SQLException e) {
// session注销时候调用,把连接放入池中
e.printStackTrace();
}
finally{
connection=null;
}
}
}
5.2.5 Jsp中如何运用数据源
由于数据连接池的生命周期是整个应用程序,所以他们的范围(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>