Tomcat 7 的JDBC连接池实现类为org.apache.tomcat.jdbc.pool
,作为替换commons-dbcp
的方案。
替换commons-dbcp
的原因如下:
-
commons-dbcp
是单线程的,为了线程安全,就要琐住整个连接池,查询验证阶段也要琐住整个连接池。
-
commons-dbcp
速度慢,性能差,多CPU的环境下单线程运行,不支持高并发,在JAVA 6中也不能解决速度和并发的问题。
-
commons-dbcp
实现复杂,超过60个类。tomcat-jdbc-pool
核心只有8个类,修改更加简单,只需运行连接池本身,易测试。
-
commons-dbcp
应用静态接口,就意味着并不能用JDK 1.6编译它,在JDK 1.6/1.7中运行时,即使驱动程序支持,所有没有实现的方法也都会抛出NoSuchMethodException
异常。
-
commons-dbcp
几乎停滞,很少更新。
- 作为一个连接池的简单实现不值得重写超过60个类。
- Tomcat jdbc连接池实现了一个
commons-dbcp
没有的公平算法,并且比commons-dbcp
性能更好。
- Tomcat jdbc连接池实现了异步获取连接,也不需增加额外的线程。
- Tomcat jdbc连接池是一个Tomcat的模块,依赖于Tomcat JULI(Tomcat日志框架)
- 使用
javax.sql.PooledConnection
接口获取连接。
- 饥饿算法。如果连接池空了,同时一个线程要获得连接,当一个连接返回到连接池,连接池会将正确的线程唤醒。
除了commons-dbcp
连接池,还有其它可以选择的方案,如c3p0
,bonecp
等,与这些连接池实现相比,Tomcat jdbc pool更突出的功能体现在:
- 支持多核系统,提供更好的高并发性能。
- 接口动态实现,运行时环境支持
java.sql
和javax.sql
接口,可以使用低版本JDK编译。
- 无需每次使用连接时都验证连接,可以在获取或返回连接时验证,不用比设置的间隔时间更频繁。
- 当数据库连接建立时,一个可设置的查询将运行一次。这对保持连接建立整个时间中的会话十分有用。
- 可以自定义拦截器增强功能。可定义拦截器来收集查询统计,缓存会话状态,重新连接,重新查询,缓存查询结果等。
- 高性能
- 极其简单,由于非常简单的实现,源程序行数和文件数很少,相比c3p0的200多个源程序文件,Tomcat jdbc只有8个核心源文件,关于连接池的部分只有4个文件。这样更容易追溯和修改Bug。减少复杂性就是起初开发的一个焦点。
- 异步获取连接,可将连接请求形成队列,系统返回
Future<Connection>
- 更好的空闲连接处理,应用更优化的算法调整连接池大小和连接的释放。
- 用户来决定当连接池满了在什么时刻释放连接,或者直接设置一个超时的阀值。
- 释放连接定时器将会在查询时重置。允许一个使用很长时间的连接不超时。这个功能由
ResetAbandonedTimer
完成。
- 在连接一定长时间后关闭连接。时间与返回连接池的时间相似。
- 当连接要被释放时,将得到JMX通知并且记录整个日志。这和
removeAbandonedTimeout
相似,但是只输出信息,不做任何操作。使用suspectTimeout
属性完成设置。
- 可以从
java.sql.Driver
,javax.sql.DataSource
或者javax.sql.XADataSource
中取得连接,使用dataSource
和dataSourceJNDI
属性完成。
- 支持XA连接。
如何使用
01 |
import java.sql.Connection;
|
02 |
import java.sql.ResultSet;
|
03 |
import java.sql.Statement;
|
05 |
import org.apache.tomcat.jdbc.pool.DataSource;
|
06 |
import org.apache.tomcat.jdbc.pool.PoolProperties;
|
08 |
public class SimplePOJOExample {
|
10 |
public static void main(String[] args) throws Exception {
|
11 |
PoolProperties p = new PoolProperties();
|
13 |
p.setDriverClassName( "com.mysql.jdbc.Driver" );
|
14 |
p.setUsername( "root" );
|
15 |
p.setPassword( "password" );
|
16 |
p.setJmxEnabled( true );
|
17 |
p.setTestWhileIdle( false );
|
18 |
p.setTestOnBorrow( true );
|
19 |
p.setValidationQuery( "SELECT 1" );
|
20 |
p.setTestOnReturn( false );
|
21 |
p.setValidationInterval( 30000 );
|
22 |
p.setTimeBetweenEvictionRunsMillis( 30000 );
|
26 |
p.setRemoveAbandonedTimeout( 60 );
|
27 |
p.setMinEvictableIdleTimeMillis( 30000 );
|
29 |
p.setLogAbandoned( true );
|
30 |
p.setRemoveAbandoned( true );
|
31 |
p.setJdbcInterceptors( "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" +
|
32 |
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" );
|
33 |
DataSource datasource = new DataSource();
|
34 |
datasource.setPoolProperties(p);
|
36 |
Connection con = null ;
|
38 |
con = datasource.getConnection();
|
39 |
Statement st = con.createStatement();
|
40 |
ResultSet rs = st.executeQuery( "select * from user" );
|
43 |
System.out.println((cnt++)+ ". Host:" +rs.getString( "Host" )+
|
44 |
" User:" +rs.getString( "User" )+ " Password:" +rs.getString( "Password" ));
|
49 |
if (con!= null ) try {con.close();} catch (Exception ignore) {}
|
1 |
< resource name = "jdbc/TestDB" auth = "Container" type = "javax.sql.DataSource" factory = "org.apache.tomcat.jdbc.pool.DataSourceFactory" testwhileidle = "true" testonborrow = "true" testonreturn = "false" validationquery = "SELECT 1" 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 = "password" driverclassname = "com.mysql.jdbc.Driver" url = "jdbc:mysql://localhost:3306/mysql" >
|
- 异步获取连接1.必须将
fairQueue
设置为true
2.必须将数据源转换为org.apache.tomcat.jdbc.pool.DataSource
01 |
Connection con = null ;
|
03 |
Future future = datasource.getConnectionAsync();
|
04 |
while (!future.isDone()) {
|
05 |
System.out.println( "Connection is not yet available. Do some background work" );
|
07 |
Thread.sleep( 100 ); //simulate work
|
08 |
} catch (InterruptedException x) {
|
09 |
Thread.currentThread().interrupted();
|
12 |
con = future.get(); //should return instantly
|
13 |
Statement st = con.createStatement(); |
14 |
ResultSet rs = st.executeQuery( "select * from user" );
|
分享到:
相关推荐
Tomcat6.0使用jdbc连接池连接[参考].pdf
Tomcat6.0使用jdbc连接池连接mysql--操作步骤介绍 初学者比不可少的
NULL 博文链接:https://jackyin5918.iteye.com/blog/1922379
Jdbc连接池 以往Tomcat5.0的连接池配置是在http://localhost:8080/admin/下进行的非常方便,可是5.0以后的版本里面Tomcat就没有把admin集成到程序中了。Tomcat5.5的admin可以在apache官方网站上下到,也可以通过...
Tomcat关于jdbc连接池的配置 包含tomcat6.0与tomcat5.5
此类非常简单,免去了网上众多资料里所说的麻烦的tomcat配置,更强的是它可以通用!不仅oracle,mysql,sqlserver2000都行,因为它依据的是你自己连接数据库的驱动。当然首先你要保证你拥有一个能连接自己数据库的对应...
Tomcat5配置Mysql JDBC数据库连接池
Tomcat5配置MysqlJDBC数据库连接池(JNDI方式)
Tomcat5配置MySQL JDBC数据库连接池
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象 DBCP (Database Connection Pool)是一个依赖Jakarta ...
* driverClassName - 所使用的JDBC驱动类全称。 * maxActive - 同一时刻可以自数据库连接池中被分配的最大活动实例数。 * maxIdle - 同一时刻数据库连接池中处于非活动状态的最大连接数。 * maxWait - 当连接池中...
Tomcat5配置MysqlJDBC数据库连接池.pdf
Tomcat5配置MysqlJDBC数据库连接池可用.pdf
tomcat-jdbc.jar下载,java中使用连接池连接MySQL时所需jar包
详细讲解tomcat 连接池数据库解密加密方法以及过程。
支持tomcat服务器的数据库连接池,用于jdbc桥连接
接连将文件覆盖即可,也可以...这是MYSQL配置方法,如果想换其它的数据库只需要改变username="xxx" password="xxx" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1/blog" 即可,还有驱动类包
Tomcat5连接池的配置 1 创建一个工程 2 webModule 3 javabean(连接类) 4 部署到应用服务器
apache-tomcat-5.5.25.exe+连接池.rar+sqljdbc