1.在项目的META-INF下面,添加context.xml文件(指定单个项目使用数据库连接池,也可配置全局的):
<?xml version="1.0" encoding="UTF-8"?>
<Context >
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<Resource
<!-- 数据库名称 -->
name="drp"
<!-- 数据源对应的java类型 -->
type="javax.sql.DataSource"
<!-- 数据库连接池中最大连接数,0表示无限制 -->
maxActive="3"
<!--连接池处于空闲状态的数据库连接的最大数目,取0表示不受限制-->
maxIdle="1"
<!-- 最大等待连接时间,若超出此时间则出现异常,-1表示无限制 -->
maxWait="1000"
<!-- 数据库连接地址 -->
url="jdbc:oracle:thin:@localhost:1521:orcl"
<!-- 数据库驱动 -->
driverClassName="oracle.jdbc.driver.OracleDriver"
<!-- 数据库登录名和密码 -->
username="DRP" password="DRP123456"
/>
</Context>
2.取得连接
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/drp");
conn = ds.getConnection();
pstmt = conn.prepareStatement("select * from t_user");
rs = pstmt.executeQuery();
...
}catch(Exception e) {
e.printStackTrace();
}finally {
if (rs != null) {rs.close();}
if (pstmt != null) {pstmt.close();}
if (conn != null) {
//将Connection放到连接池中
conn.close();
}
}
用完连接时一定要释放
对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决我们的问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
为什么使用连接池
连接,是我们的编程语言与数据库交互的一种方式。我们经常会听到这么一句话“数据库连接很昂贵“。
有人接受这种说法,却不知道它的真正含义。因此,下面通过实例解释它究竟是什么。
下面是Mysql数据库创建连接的的一段代码:
String connUrl ="jdbc:mysql://your.database.domain/yourDBname";
Class.forName("com.mysql.jdbc.Driver");
Connection con =DriverManager.getConnection (connUrl);
当我们创建了一个Connection对象,它在内部都执行了什么:
- “DriverManager”检查并注册驱动程序;
- “com.mysql.jdbc.Driver”就是我们注册了的驱动程序,它会在驱动程序类中调用“connect(url…)”方法。
- com.mysql.jdbc.Driver的connect方法根据我们请求的“connUrl”,创建一个“Socket连接”,连接到IP为“your.database.domain”,默认端口3306的数据库。
- 创建的Socket连接将被用来查询我们指定的数据库,并最终让程序返回得到一个结果。
简单的获取一个连接,系统却要在背后做很多消耗资源的事情,大多时候,创建连接的时间比执行sql语句的时间还要长。
传统的获取连接方式如下图所示:
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。
采用连接池技术后的过程如下:
连接过程:maxActive=”3” , maxIdle=”1” ,maxWait=”1000” ,在连接池处于空闲状态时,里面有1个连接,如果再有请求,连接池就会再创建连接,但连接池中最多有3个连接,如果第4个请求连接过来了,必须等待了,知道有个连接释放(断开连接时,连接不会立即被释放,而是1000毫秒后才释放),如果此时没有超时,第4个连接就用释放的,当没有用户连接时,连接池中还是保持1个连接
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
四个流行的Java连接池:
- C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection
和Statement 池的DataSources
对象。(主页:http://sourceforge.net/projects/c3p0/) - BoneCP 是一个开源的快速的 JDBC 连接池。BoneCP很小,只有四十几K(运行时需要log4j和Google
Collections的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。另外个人觉得 BoneCP
有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是 BoneCP 优秀的原因,BoneCP 到底有什么突出的地方呢,请看看性能测试报告。(主页:http://jolbox.com/) - DBCP(Database Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK
版本了,功能上倒是没有什么区别。(主页:http://commons.apache.org/dbcp/) - Proxool是一个Java SQL
Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。(主页:http://proxool.sourceforge.net/)
出现的问题
连接次数不对应????