一.什么是数据库连接池?
数据库连接池(Connectionpooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来
避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
二.数据库连接池原理:
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲
连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接
池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况
等。
结构图:
三.影响因素:
1. 最小连接数
是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2. 最大连接数
是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3. 最小连接数与最大连接数差距
最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
四.连接池的配置
配置信息可在Tomcat的文档中找到:
一、打开Tomcat主页
二、
三、
四、
五、
六、
《1》copy响应的jar到Tomcat/lib
《2》添加以下配置信息到conf/context.xml
Oracle:
<Resourcename="jdbc/news" auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="scott"
password="tiger"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:orcl"
/>
MySql:
<Resourcename="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?autoReconnect=true"
maxTotal="8"
maxIdle="4"/>
参数说明:
①maxIdle连接池中最多可空闲maxIdle个连接
②minIdle连接池中最少空闲maxIdle个连接
③initialSize初始化连接数目
④maxWait连接池中连接用完时,新的请求等待时间,毫秒
⑤username数据库用户名
⑥password数据库密码
《3》配置conf/web.xml
<resource-ref>
<!-- 描述-->
<description>DBConnection</description>
<!-- 参考数据源名字,同Tomcat中配置的Resource节点中name属性值"jdbc/mysqlds"一致 -->
<res-ref-name>jdbc/TestDB</res-ref-name>
<!-- 资源类型 -->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
《4》进行代码测试
JSP: <body>
<%
Context context=new InitialContext();
Context javacontext=(Context)context.lookup("java:/comp/env");
DataSource dataSource=(DataSource)javacontext.lookup("jdbc/TestDB");
Connection conn=dataSource.getConnection();
out.println(conn);
%>
<br>
</body>
输出结果:连接成功!
JavaDBHelper:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DBHelper {
//数据库连接
public static Connection getConn(){
Context context;
try {
//初始化查找命名空间(查询大池子)
context = new InitialContext();
//参数java:/comp/env为固定路径(寻找java环境---大池子中的小池子)
Context javacontext=(Context) context.lookup("java:/comp/env");
//寻找数据源(参数jdbc/TestDB为数据源和JNDI绑定的名字)
DataSource dataSource=(DataSource) javacontext.lookup("jdbc/TestDB");
return dataSource.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//数据库关闭
public static void close(Connection conn,PreparedStatement ps,ResultSet rs){
try {
if(conn!=null&&!conn.isClosed()){
conn.close();
}
if(ps!=null){
ps.close();
}
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}