您的位置:首页 > 运维架构 > Tomcat

Tomcat7 新的数据库连接池Tomcat jdbc pool介绍和配置

2016-09-04 10:36 776 查看
Tomcat 在 7.0 以前的版本都是使用commons-dbcp做为连接池的实现,但是 dbcp存在一些问题:

(1)dbcp 是单线程的,为了保证线程安全会锁整个连接池

(2)dbcp 性能不佳

(3)dbcp 太复杂,超过 60 个类,发展滞后。

因此,通常J2EE中还会使用其它的高性能连接池,如
C3P0,还有阿里系的
druid 等。为此,Tomcat 从 7.0 开始引入一个新的模块:
Tomcat jdbc pool

tomcat jdbc pool 近乎兼容 dbcp ,性能更高

异步方式获取连接

tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架

使用 javax.sql.PooledConnection 接口获取连接

支持高并发应用环境

超简单,核心文件只有8个,比 c3p0 还少

更好的空闲连接处理机制

支持 JMX

支持 XA Connection。

tomcat jdbc pool 可在 Tomcat 中直接使用,也可以在独立的应用中使用。

1.Tomcat 中直接使用的方法:

在conf/server.xml下的<GlobalNamingResources>节点里配置resource,例如:

<Resource name="jdbc/ens"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors=
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="123"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ens"/>


然后,在context.xml文件的<Context></Context>节点中添加如下配置:

<ResourceLink global="jdbc/ens" name="jdbc/ens" type="javax.sql.DataSource"/>


global="jdbc/ens" 中的参数值("jdbc/ens")必须和上一段<Resource >配置中的name属性的值保持一样。name="jdbc/ens" 这个可以随便取,但是在程序中调用的时候,就应该与name的值保持一致。到这里,连接池已经配置好啦。

用JSP测试一下:

<%@ page language="java" pageEncoding="gbk"%>
<%@page import="java.sql.Connection"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.ResultSet"%>
<%
//连接池的获取
Connection conn = null;
DataSource ds = null;
ResultSet rs  =null;
Statement stmt = null;
Context initCtx = new InitialContext();
ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/ens");
if(ds!=null){
out.println("已经获得DataSource!");
out.println("<br>");
conn = ds.getConnection();
try{
stmt = conn.createStatement();
String sql ="select * from ens_area";
rs = stmt.executeQuery(sql);
out.println("以下是从数据库中读取出来的数据:<br>");
while(rs.next()){
out.println("<br>");
out.println(rs.getString("area_name"));
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
conn.close();
rs.close();
stmt.close();
}
}
%>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Tomcat JDBC