皕杰技术社区

 找回密码
 立即加入

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1534|回复: 23

[分享] tomcat-jdbc-pool

[复制链接]
发表于 2019-7-31 15:18:09 | 显示全部楼层 |阅读模式
Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做为连接池的实现,但是 dbcp 饱受诟病,原因有:
1.dbcp 是单线程的,为了保证线程安全会锁整个连接池
2.dbcp 性能不佳
3.dbcp 太复杂,超过 60 个类
4.dbcp 使用静态接口,在 JDK 1.6 编译有问题
5.dbcp 发展滞后
因此很多人会选择一些第三方的连接池组件,例如 c3p0 , bonecp, druid (@wenshao ) 等。
为此,Tomcat 从 7.0 开始引入一个新的模块:Tomcat jdbc pool
1.tomcat jdbc pool 近乎兼容 dbcp ,性能更高
2.异步方式获取连接
3.tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架
4.使用 javax.sql.PooledConnection 接口获取连接
5.支持高并发应用环境
6.超简单,核心文件只有8个,比 c3p0 还
7.更好的空闲连接处理机制
8.支持 JMX
9.支持 XA Connection
10.tomcat jdbc pool 可在 Tomcat 中直接使用,也可以在独立的应用中使用。

 楼主| 发表于 2019-7-31 15:52:24 | 显示全部楼层
Tomcat 中直接使用的方法。
数据源配置:

  1. <Resource name="jdbc/TestDB"
  2. username="root"
  3.           password="password"
  4.           driverClassName="com.mysql.jdbc.Driver"
  5.           url="jdbc:mysql://localhost:3306/mysql"
  6.           auth="Container"
  7.           type="javax.sql.DataSource"
  8.           factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
  9.           testWhileIdle="true"
  10.           testOnBorrow="true"
  11.           testOnReturn="false"
  12.           validationQuery="SELECT 1"
  13.           validationInterval="30000"
  14.           timeBetweenEvictionRunsMillis="30000"
  15.           maxActive="100"
  16.           minIdle="10"
  17.           maxWait="10000"
  18.           initialSize="10"
  19.           removeAbandonedTimeout="60"
  20.           removeAbandoned="true"
  21.           logAbandoned="true"
  22.           minEvictableIdleTimeMillis="30000"
  23.           jmxEnabled="true"

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 15:53:42 | 显示全部楼层
  1.           jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
  2.             org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
  3.           />
复制代码


异步获取连接的方法:
  1. Connection con = null;
  2.   try {
  3.     Future<Connection> future = datasource.getConnectionAsync();
  4.     while (!future.isDone()) {
  5.       System.out.println("Connection is not yet available. Do some background work");
  6.       try {
  7.         Thread.sleep(100); //simulate work
  8.       }catch (InterruptedException x) {
  9.         Thread.currentThread().interrupt();
  10.       }
  11.     }
  12.     con = future.get(); //should return instantly
  13.     Statement st = con.createStatement();
  14.     ResultSet rs = st.executeQuery("select * from user");
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 16:03:16 | 显示全部楼层
通用属性
属性名描述(DBCP/Tomcat jdbc-pool 差别 )DBCP默认值jdbc-pool默认值
username用户名--
password密码--
url建立连接的URL--
driverClassName驱动的完整有效的java类名--
connectionProperties(String) 当建立新连接时被发送给JDBC 驱动的连接参数,格式必须是 [propertyName=property;]*注意 :参数user/password 将被明确传递,所以不需要包括在这里。--
defaultAutoCommit(boolean) 连接池创建的连接的默认的auto-commit 状态TRUEdriver default

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 16:05:57 | 显示全部楼层

defaultReadOnly(boolean) 连接池创建的连接的默认的read-only 状态。 如果没有设置则setReadOnly 方法将不会被调用。 ( 某些驱动不支持只读模式, 比如:Informix)driver defaultdriver default
defaultTransactionIsolation(String) 连接池创建的连接的默认的TransactionIsolation 状态。 下面列表当中的某一个: ( 参考javadoc) NONE
READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE
driver defaultdriver default
defaultCatalog(String) 连接池创建的连接的默认的catalog-driver default
initialSize(int) 初始化连接: 连接池启动时创建的初始化连接数量,1。2 版本后支持010

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 16:07:57 | 显示全部楼层
maxActive(int) 最大活动连接: 连接池在同一时间能够分配的最大活动连接的数量, 如果设置为非正数则表示不限制8100
maxIdle(int) 最大空闲连接: 连接池中容许保持空闲状态的最大连接数量, 超过的空闲连接将被释放, 如果设置为负数表示不限制 如果启用,将定期检查限制连接,如果空闲时间超过minEvictableIdleTimeMillis 则释放连接 ( 参考testWhileIdle )8与maxActive相同
minIdle(int) 最小空闲连接: 连接池中容许保持空闲状态的最小连接数量, 低于这个数量将创建新的连接, 如果设置为0 则不创建 如果连接验证失败将缩小这个值( 参考testWhileIdle )0与initialSize 相同

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 16:09:32 | 显示全部楼层
maxWait(int) 最大等待时间: 当没有可用连接时, 连接池等待连接被归还的最大时间( 以毫秒计数), 超过时间则抛出异常, 如果设置为-1 表示无限等待无限30000(30秒)
validationQuery(String) SQL 查询, 用来验证从连接池取出的连接, 在将连接返回给调用者之前。 如果指定, 则查询必须是一个SQL SELECT 并且必须返回至少一行记录 查询不必返回记录,但这样将不能抛出SQL异常--
testOnBorrow(boolean) 指明是否在从池中取出连接前进行检验, 如果检验失败, 则从池中去除连接并尝试取出另一个。注意: 设置为true 后如果要生效,validationQuery 参数必须设置为非空字符串 参考validationInterval以获得更有效的验证TRUEFALSE

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 16:11:01 | 显示全部楼层
testOnReturn(boolean) 指明是否在归还到池中前进行检验 注意: 设置为true 后如果要生效,validationQuery 参数必须设置为非空字符串FALSEFALSE
testWhileIdle(boolean) 指明连接是否被空闲连接回收器( 如果有) 进行检验。 如果检测失败, 则连接将被从池中去除。注意: 设置为true 后如果要生效,validationQuery 参数必须设置为非空字符串FALSEFALSE
timeBetweenEvictionRunsMillis(int) 在空闲连接回收器线程运行期间休眠的时间值, 以毫秒为单位。 如果设置为非正数, 则不运行空闲连接回收器线程 这个值不应该小于1秒,它决定线程多久验证连接或丢弃连接-15000(5秒)

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 16:12:16 | 显示全部楼层
numTestsPerEvictionRun(int) 在每次空闲连接回收器线程( 如果有) 运行时检查的连接数量FALSE未使用
minEvictableIdleTimeMillis连接在池中保持空闲而不被空闲连接回收器线程( 如果有) 回收的最小时间值,单位毫秒1000 6030(30分钟)60000(60秒)
poolPreparedStatements(boolean) 开启池的prepared statement 池功能FALSE未使用
maxOpenPreparedStatements(int)statement 池能够同时分配的打开的statements 的最大数量, 如果设置为0 表示不限制不限制未使用

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 16:14:22 | 显示全部楼层
accessToUnderlyingConnectionAllowed(boolean) 控制PoolGuard 是否容许获取底层连接 jdbc-pool中未使用此属性;可以通过调用连接的unwrap方法取得控制权。参考javax。sql。DataSource接口,通过反射调用getConnection方法,或强制转换为javax。sql。PooledConnection对象。FALSE未使用
removeAbandoned(boolean) 标记是否删除泄露的连接, 如果他们超过了removeAbandonedTimout 的限制。 如果设置为true, 连接被认为是被泄露并且可以被删除, 如果空闲时间超过removeAbandonedTimeout。 设置为true 可以为写法糟糕的没有关闭连接的程序修复数据库连接。 参考logAbandonedFALSEFALSE
removeAbandonedTimeout(int) 泄露的连接可以被删除的超时值, 单位秒应设置为应用中查询执行最长的时间30060

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ|小黑屋|手机版|皕杰软件 ( 京ICP备14050931号 )

GMT+8, 2024-4-25 16:47 , Processed in 1.146409 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表