JAVA学习札记

人生起航点!
posts - 18, comments - 0, trackbacks - 0, articles - 0
  语源科技BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

数据库连接池

Posted on 2011-10-10 15:38 簡簡單單 阅读(1056) 评论(0)  编辑  收藏 所属分类: DataBase
一.数据库连接池的概念及作用

    数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
二.数据库连接池的相关因素
    数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
   1) 最小连接数
          是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
  2) 最大连接数
          是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作;
  3) 如果最小连接数与最大连接数相差太大
         那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
三.相关解释 

最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源。由于频繁的打开和关闭连接对jvm包括数据库都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题。由此使用连接池的作用就显现出来,他的原理其实不复杂:先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是准备给下一个调用者进行分配。由此可以看出连接池节省了大量的数据库连接打开和关闭的动作,对系统性能提升的益处不言而喻。
几个概念:
最小连接--应用启动后随即打开的连接数以及后续最小维持的连接数。
最大连接数--应用能够使用的最多的连接数
连接增长数--应用每次新打开的连接个数
举个例子说明连接池的运作:
假设设置了最小和最大的连接为10,20,那么应用一旦启动则首先打开10个数据库连接,但注意此时数据库连接池的正在使用数字为0--因为你并没有使用这些连接,而空闲的数量则是10。然后你开始登录,假设登录代码使用了一个连接进行查询,那么此时数据库连接池的正在使用数字为1、空闲数为9,这并不需要从数据库打开连接--因为连接池已经准备好了10个给你留着呢。登录结束了,当前连接池的连接数量是多少?当然是0,因为那个连接随着事务的结束已经返还给连接池了。然后同时有11个人在同一秒进行登录,会发生什么:连接池从数据库新申请(打开)了一个连接,连同另外的10个一并送出,这个瞬间连接池的使用数是11个,不过没关系正常情况下过一会儿又会变成0。如果同时有21个人登录呢?那第21个人就只能等前面的某个人登录完毕后释放连接给他。这时连接池开启了20个数据库连接--虽然很可能正在使用数量的已经降为0,那么20个连接会一直保持吗?当然不,连接池会在一定时间内关闭一定量的连接还给数据库,在这个例子里数字是20-10=10,因为只需要保持最小连接数就好了,而这个时间周期也是连接池里配置的。

 四.java中常用开源的数据库连接池
      1).C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
          这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:c3p0.xml。
          使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,此外不提供连接池监控。

  2).Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
          proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
          使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码
          在另外2个开源连接池中成功结束,但在proxool中出现异常退出。
         但是proxool有一个优势--连接池监控,这是个很诱人的东西,大概的配置方式就是在web.xml中添加如下定义

1     <servlet>
2         <servlet-name>admin</servlet-name>
3         <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>      
4    </servlet>
5    <servlet-mapping>
6       <servlet-name>admin</servlet-name>
7       <url-pattern>/admin</url-pattern>
8    </servlet-mapping>   
9 

   并在应用启动后访问:http://localhost:8080/myapp/admin这个url即可监控 
      3).Jakarta DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。
          dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
          这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
          使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控
五.Proxool应用举例
下载最新版本http://proxool.sourceforge.net
1).配置proxool.xml文件

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!--
 3the proxool configuration can be embedded within your own
 4application's. Anything outside the "proxool" tag is ignored.
 5-->
 6<something-else-entirely>
 7<proxool>
 8<alias>dbname</alias> <!--数据源的别名-->
 9<driver-url>jdbc:oracle:thin:@127.0.0.1:1521:testdb</driver-url><!--url连接串-->
10<driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <!--驱动类-->
11<driver-properties>
12<property name="user" value="username" /> <!--用户名-->
13<property name="password" value="password" /><!--密码-->
14</driver-properties>
15<!--最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定 -->
16<maximum-connection-count>100</maximum-connection-count>
17<!--最小连接数(默认2个)-->
18<minimum-connection-count>10</minimum-connection-count>
19<!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒-->
20<house-keeping-sleep-time>90000</house-keeping-sleep-time>
21<!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->
22<maximum-new-connections>10</maximum-new-connections>
23<!--最少保持的空闲连接数(默认2个)-->
24<prototype-count>5</prototype-count>
25<!--在使用之前测试-->
26<test-before-use>true</test-before-use>
27<!--用于保持连接的测试语句 -->
28<house-keeping-test-sql>select sysdate from dual</house-keeping-test-sql>
29</proxool>
30</something-else-entirely>

2).配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.configuration.ServletConfigurator
</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
<!-- 配置受保护域,只有Tomcat管理员才能察看连接池的信息 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>proxool</web-resource-name>
<url-pattern>/admin</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>proxool manager Application</realm-name>
</login-config>
<security-role>
<description>The role that is required to log in to the Manager Application</description>
<role-name>manager</role-name>
</security-role>
<error-page>
<error-code>401</error-code>
<location>/401.jsp</location>
</error-page>
</web-app>

ServletConfigurator:加载并初始化proxool.xml文件,因为它是连接数据库的.其他很多模块都用到数据,所以必须首先加载它
load-on-startup:数值越小,就会先被加载初始化
Admin:监控数据库连接池的连接情况
//获得数据库连接的语句
Connection conn=DriverManager.getConnection("proxool.dbname");

注意:测试连接池的时候要将程序放到数据库服务器上 ,因为数据库连接池本身就是服务器端技术。

 1<%@ page language="java" import="java.util.*,java.sql.*,org.logicalcobwebs.proxool.configuration.JAXPConfigurator;" pageEncoding="UTF-8"%>
 2
 3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4<html>
 5  <head>
 6    <title>proxoolTest</title>
 7  </head>
 8  
 9  <body>
10  <%
11    Connection conn = null;
12    try {
13        Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
14        JAXPConfigurator.configure("WEB-INF/config/proxool.xml"false); // false 表示不验证 
15        conn = DriverManager.getConnection("proxool.example");
16    }catch(Exception e){
17        out.println(e);
18    }
19    out.print("ok");
20  
%>
21
22  </body>
23</html>

 

 1 <%@ page language="java" import="java.util.*,java.sql.*;" pageEncoding="UTF-8"%>
 2 
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6     <title>proxoolTest</title>
 7   </head>
 8   
 9   <body>
10   <%
11     Connection conn = null;
12     try {
13         Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
14         conn= DriverManager.getConnection("proxool.oracle");
15     }catch(Exception e){
16         out.println(e);
17     }
18     out.print(conn.toString());
19   %>
20 
21   </body>
22 </html>







   
      

 


只有注册用户登录后才能发表评论。


网站导航: