读书人

施用容器管理连接池方案

发布时间: 2012-07-19 16:02:20 作者: rapoo

使用容器管理连接池方案

1.??? 现状与目的
1、门户网站(ROOT目录)下面有很多小应用,由于历史遗留原因,上面有很多小应用,这些小应用都没有使用连接池(因为不可以在一个应用里部署多个连接池,hibernate版本太老造成的),通过使用容器提供的连接池,把ROOT下的小应用程序都改为使用连接池的,可以提高应用性能。
2、Dbcp连接池有个bug(主要是应用中使用的hibernate的版本太老了,hibernate启用不了dbcp自动关闭连接的特性),如果应用维护连接池,removeAbandoned(检查没有关闭的连接,自动关闭)不生效,通过使用容器提供的连接池,可以自动关闭idle连接。通过使用logAbandoned,dbcp打印没有关闭连接应用的堆栈信息,可以方便找出没有正确关闭连接的应用,便于应用bug检查。
2.??? 配置修改与使用
1、??? 修改tomcat6配置:
l??? 加入oracle驱动
把ojdbc14.jar复制到%CATALINA_HOME%/lib目录
l??? 加入tomcat连接池配置
修改%CATALINA_HOME%/conf/context.xml,增加下列配置
<Resource
name="jdbc/cqydt"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@10.191.34.117:1521:ecom"
username="cqydt"
password="cqydt-117-passwd123"
maxActive="20"
maxIdle="5"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
maxWait="3000"/>

<Resource
name="jdbc/cqydwsc"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@10.191.34.117:1521:ecom"
username="cqydwsc1"
password="cqydwsc-117-passwd123"
maxActive="40"
maxIdle="5"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
maxWait="3000"/>

<Resource
name="jdbc/cqmcuser"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@10.191.34.117:1521:ecom"
username="cqmcuser "
password="cqmcuser-117-passwd123"
maxActive="20"
maxIdle="5"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
maxWait="3000"/>

上面配置cqydwc1、cqydt、cqmcuser用户的连接池。
2、??? 修改小应用,获取数据库连接
获取cqydt的连接
Context initCtx = new InitialContext();
??? ds? = (DataSource) initCtx.lookup("java:comp/env/jdbc/cqydt");
Connection conn = ds.getConnection();?
获取cqmcuser的连接
Context initCtx = new InitialContext();
??? ds? = (DataSource) initCtx.lookup("java:comp/env/jdbc/cqmcuser");
??? Connection conn = ds.getConnection();?
获取cqydwsc的连接
Context initCtx = new InitialContext();
??? ds? = (DataSource) initCtx.lookup("java:comp/env/jdbc/cqydt");
??? Connection conn = ds.getConnection();?

3、??? 修改应用配置
删除原有hibernate中关于数据的配置,保留
<property name="dialect">
??????????????? net.sf.hibernate.dialect.OracleDialect
</property>
增加
<property name="hibernate.connection.datasource">java:/comp/env/jdbc/cqydwsc</property>
<property name="hibernate.connection.datasource">java:/comp/env/jdbc/cqydt </property>

<property name="hibernate.connection.datasource">java:/comp/env/jdbc/cqmcuser</property>

3.??? 测试
以上配置在以下环境配置生效:
os:win 7 (64 bit)
jvm: jrockit 6.x (64 bit)
tomcat: 6.0.x(64 bit)
jdbc driver:ojdbc14.jar
hibernate:2.0
jsp:2.5

需测试在服务器环境中测试能否生效,测试内容包括:
1.??? 应用是否能正常使用
2.??? 测试连接池是否能自动关闭超过removeAbandonedTimeout时间后的连接,检查是否能定位到没有关闭连接的应用,在测试时,removeAbandonedTimeout值配置为300(5分钟)。
测试连接池配置如下:
<Resource
name="jdbc/cqmcuser"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@10.191.34.117:ecom"
username="cqmcuser "
password="cqmcuser-117-passwd123"
maxActive="20"
maxIdle="5"
removeAbandoned="true"
removeAbandonedTimeout="300"
logAbandoned="true"
maxWait="3000"/>

测试脚本如下:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en"? "http://www.w3.org/TR/REC-html40/strict.dtd">
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="org.apache.commons.logging.Log"%>
<%@ page import="org.apache.commons.logging.LogFactory"%>
<%@ page session="false"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%
??? Log log = LogFactory.getLog(this.getClass());
??? DataSource ds = null;
??? try {
??? ??? Context initCtx = new InitialContext();
??? ??? ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/cqmcuser");
??? ??? Connection conn = ds.getConnection();
??? ??? log.info("get connect success");
??? ??? Statement stmt = conn.createStatement();
??? ??? String strSql = " select 'yes' from dual";
??? ??? ResultSet rs = stmt.executeQuery(strSql);
??? ??? while (rs.next()) {
??? ??? ??? out.println("<br/>");
??? ??? ??? out.print(rs.getString(1));
??? ??? ??? out.println("<br/>");
??? ??? ??? out.println("Test Success");
??? ??? ??? out.println("<br/>");
??? ??? }
??? ??? log.info("execute sql success");
??? } catch (Exception ex) {
??? ??? out.print(ex.getMessage());
??? ??? log.info(ex.getStackTrace());
??? }
%>

此脚本没有关闭数据库连接。执行此脚本,直到出现Cannot get a connection, pool exhausted,此时连接池已经耗尽,然后等待300秒后继续测试,查看是否可以成功连接,测试是否能够通过日志找到此脚本。

读书人网 >移动开发

热点推荐