【Java】数据库连接池

23 篇文章 5 订阅
15 篇文章 0 订阅

        数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。因此提出了一种概念--数据库连接池。

        数据库连接池的基本原理是在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。当程序中需要建立数据库连接时,只需从内存中获取一个数据库连接来用,而不是新建一个数据库连接,在使用完毕后,只需放回内存既可。对于连接的建立和断开都由连接池自己管理。

下面通过tomcat连接池的配置具体了解一下连接池的应用。

步骤1:打开tomcat管理界面,登陆,配置,生成配置内容,然后再走步骤2。(试验了两种从管理界面配置的方法都没成功,暂时无果,所以就直接走步骤2吧)

步骤2:直接在apache-tomcat-7.0.69\conf下找到context.xml文件,配置成如下形式:

<?xml version='1.0' encoding='utf-8'?>

<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
	 <Resource name="jdbc/mydrp" 
        auth="Container" 
        type="javax.sql.DataSource" 
        username="root" 
        password="123" 
        maxIdle="30" 
        maxWait="10000" 
        maxActive="100"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/drp" />
</Context>

具体参数说明:

   ①name:即JNDI NAME,是指注册到JDNI输上的名称。

   ②username:访问数据库的用户名称。

   ③password:访问数据库的用户密码。

   ④maxIdle:最大空闲连接数,表示没有数据库连接时,连接池也必须保持最大空闲连接数,设置为0没有限制。

   ⑤maxWait:建立连接等待时间,单位:毫秒,设置我-1无限制。

   ⑥maxActive:最大活跃连接数,指同时可以有多少个连接,设置0为无限制。

   ⑦driverClassName:连接数据库的驱动名称。

   ⑧url:连接数据库的URL

      配置好之后,就形成了DBCP Pool,那么所有用该tomcat的项目都可以使用该连接池了。现在context.xml是属于tomcat服务器的,如果只想让唯一一个项目使用,则将context.xml剪切到下图目录下:


注意:DBCP连接池装载时使用的是Common类加载器,该装载器中没有我们所需要的jdbc的驱动,我们项目中倒是有jdbc的驱动,但是那是属于Web项目的,根据双亲委派机制,在Common加载器加载时无法获取Web项目中的类,所以必须把相关的驱动复制到Common类加载器的类存放的文件夹中。因为我用的是MyEclipse自带的tomcat,所以具体的路径如下:


完事之后,需要重新启动tomcat,测试页面JSP代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
	pageEncoding="GB18030"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<%
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	try {
		//new DBCP....
		Context ctx = new InitialContext();
		//通过JNDI查找DataSource
		DataSource ds = (DataSource) ctx
				.lookup("java:comp/env/jdbc/mydrp");
		conn = ds.getConnection();
		pstmt = conn.prepareStatement("select * from t_user");
		rs = pstmt.executeQuery();
		while (rs.next()) {
			out.println(rs.getString("user_id") + ", "
					+ rs.getString("user_name"));
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		if (rs != null) {
			rs.close();
		}
		if (pstmt != null) {
			pstmt.close();
		}
		if (conn != null) {
			//将Connection放到连接池中
			conn.close();
		}
	}
%>

效果如下:


补充:数据库连接池一般都会在使用过连接之后,再将connection放回到连接池中。如果不放回的话,就代表该连接一直在使用,那么连接池的可连接数就少一个,一旦超过maxActive设置的值,就会报错。




评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值