返回首页
当前位置: 主页 > 网络编程 > Jsp实例教程 >

spring配置tomcat jdbc连接池教程

时间:2015-06-11 23:26来源:知行网www.zhixing123.cn 编辑:麦田守望者

Tomcat 7 的JDBC连接池实现类为org.apache.tomcat.jdbc.pool,作为替换commons-dbcp的方案。

替换commons-dbcp的原因如下:

  1. commons-dbcp是单线程的,为了线程安全,就要琐住整个连接池,查询验证阶段也要琐住整个连接池。
  2. commons-dbcp速度慢,性能差,多CPU的环境下单线程运行,不支持高并发,在JAVA 6中也不能解决速度和并发的问题。
  3. commons-dbcp实现复杂,超过60个类。tomcat-jdbc-pool核心只有8个类,修改更加简单,只需运行连接池本身,易测试。
  4. commons-dbcp应用静态接口,就意味着并不能用JDK 1.6编译它,在JDK 1.6/1.7中运行时,即使驱动程序支持,所有没有实现的方法也都会抛出NoSuchMethodException异常。
  5. commons-dbcp几乎停滞,很少更新。
  6. 作为一个连接池的简单实现不值得重写超过60个类。
  7. Tomcat jdbc连接池实现了一个commons-dbcp没有的公平算法,并且比commons-dbcp性能更好。
  8. Tomcat jdbc连接池实现了异步获取连接,也不需增加额外的线程。
  9. Tomcat jdbc连接池是一个Tomcat的模块,依赖于Tomcat JULI(Tomcat日志框架)
  10. 使用javax.sql.PooledConnection接口获取连接。
  11. 饥饿算法。如果连接池空了,同时一个线程要获得连接,当一个连接返回到连接池,连接池会将正确的线程唤醒。

除了commons-dbcp连接池,还有其它可以选择的方案,如c3p0,bonecp等,与这些连接池实现相比,Tomcat jdbc pool更突出的功能体现在:

  1. 支持多核系统,提供更好的高并发性能。
  2. 接口动态实现,运行时环境支持java.sql和javax.sql接口,可以使用低版本JDK编译。
  3. 无需每次使用连接时都验证连接,可以在获取或返回连接时验证,不用比设置的间隔时间更频繁。
  4. 当数据库连接建立时,一个可设置的查询将运行一次。这对保持连接建立整个时间中的会话十分有用。
  5. 可以自定义拦截器增强功能。可定义拦截器来收集查询统计,缓存会话状态,重新连接,重新查询,缓存查询结果等。
  6. 高性能
  7. 极其简单,由于非常简单的实现,源程序行数和文件数很少,相比c3p0的200多个源程序文件,Tomcat jdbc只有8个核心源文件,关于连接池的部分只有4个文件。这样更容易追溯和修改Bug。减少复杂性就是起初开发的一个焦点。
  8. 异步获取连接,可将连接请求形成队列,系统返回Future<Connection>
  9. 更好的空闲连接处理,应用更优化的算法调整连接池大小和连接的释放。
  10. 用户来决定当连接池满了在什么时刻释放连接,或者直接设置一个超时的阀值。
  11. 释放连接定时器将会在查询时重置。允许一个使用很长时间的连接不超时。这个功能由ResetAbandonedTimer完成。
  12. 在连接一定长时间后关闭连接。时间与返回连接池的时间相似。
  13. 当连接要被释放时,将得到JMX通知并且记录整个日志。这和removeAbandonedTimeout相似,但是只输出信息,不做任何操作。使用suspectTimeout属性完成设置。
  14. 可以从java.sql.Driver,javax.sql.DataSource或者javax.sql.XADataSource中取得连接,使用dataSource和dataSourceJNDI属性完成。
  15. 支持XA连接。

需要注意:使用tomcat jdbc需要将连接数据库的jar放到tomcat的lib目录下。

1、配置spring

[sourcecode]<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
destroy-method="close">
<!– Connection Info –>
< property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />

<!– Connection Pooling Info –>
< property name="initialSize" value="${tomcat.pool.initialSize.common}" />
<property name="maxActive" value="${tomcat.pool.maxActive.common}" />
<property name="maxIdle" value="${tomcat.pool.maxIdle.common}" />
<property name="minIdle" value="${tomcat.pool.minIdle.common}" />
<property name="maxWait" value="${tomcat.pool.maxWait.common}" />

<property name="testWhileIdle" value="${tomcat.pool.testWhileIdle.common}" />
<property name="validationQuery" value="${tomcat.pool.validationQuery.common}" />
<property name="validationQueryTimeout" value="${tomcat.pool.validationQueryTimeout.common}" />
<property name="validationInterval" value="${tomcat.pool.validationInterval.common}" />
<property name="timeBetweenEvictionRunsMillis" value="${tomcat.pool.timeBetweenEvictionRunsMillis.common}" />
<property name="minEvictableIdleTimeMillis" value="${tomcat.pool.minEvictableIdleTimeMillis.common}" />
<property name="numTestsPerEvictionRun" value="${tomcat.pool.numTestsPerEvictionRun.common}" />
<property name="removeAbandoned" value="${tomcat.pool.removeAbandoned.common}" />
<property name="removeAbandonedTimeout" value="${tomcat.pool.removeAbandonedTimeout.common}" />

<property name="defaultAutoCommit" value="true" />
</bean>[/sourcecode]

2、jdbc.properties配置

[sourcecode]#MySql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.1.15:3306/common?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=1921

#tomcatpool – common
#初始化连接: 连接池启动时创建的初始化连接数量
tomcat.pool.initialSize.common=5
#最大活动连接: 连接池在同一时间能够分配的最大活动连接的数量,如果设置为非正数则表示不限制
tomcat.pool.maxActive.common=60
#最大空闲连接: 连接池中容许保持空闲状态的最大连接数量, 超过的空闲连接将被释放, 如果设置为负数表示不限制
tomcat.pool.maxIdle.common=10
#最小空闲连接: 连接池中容许保持空闲状态的最小连接数量, 低于这个数量将创建新的连接, 如果设置为0则不创建.默认与initialSize相同
tomcat.pool.minIdle.common=5
# 最大等待时间: 当没有可用连接时, 连接池等待连接被归还的最大时间( 以毫秒计数), 超过时间则抛出异常, 如果设置为-1 表示无限等待单位毫秒
tomcat.pool.maxWait.common=5000

#是否对空闲连接进行校验,如果检测失败, 则连接将被从池中去除.注意: 设置为true 后如果要生效,validationQuery 参数必须设置为非空字符串
tomcat.pool.testWhileIdle.common=true
#SQL 查询, 用来验证从连接池取出的连接
tomcat.pool.validationQuery.common=SELECT 1
#校验查询超时时间以秒为单位
tomcat.pool.validationQueryTimeout.common=10
#避免过度验证,保证验证不超过这个频率——以毫秒为单位
tomcat.pool.validationInterval.common=30000
#空闲连接回收器执行间隔,单位毫秒
tomcat.pool.timeBetweenEvictionRunsMillis.common=31000
#空闲连接能够保持空闲的最小时间,单位毫秒,在这个区间不会被回收器回收
tomcat.pool.minEvictableIdleTimeMillis.common=120000
#空闲连接回收器的执行线程数
tomcat.pool.numTestsPerEvictionRun.common=10

#检查连接是否泄漏(一般是因为没有关闭连接),如果他们超过了removeAbandonedTimout 的限制.如果设置为true, 连接被认为是被泄露并且可以被删除,
tomcat.pool.removeAbandoned.common=true
#连接多久没有释放则认为是泄漏线程
tomcat.pool.removeAbandonedTimeout.common=180[/sourcecode]

------分隔线----------------------------
标签(Tag):Java JAVA实例教程 JAVA基础教程 Java源代码 Java技巧
------分隔线----------------------------
推荐内容
猜你感兴趣