小弟使用的是bonecp管理数据库连接,数据库采用oracle。在运行时,如果使用了3个以上的session连接,就会出现如下错误。

Io 异常: Socket read timed out

HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.exceptions.PersistenceException:

每次session之后,也进行了关闭,但是还是出现这个问题。但是重启Tomcat之后,可以正常发出请求,并且能得到正常结果。但是过了一段时间之后,Io异常又出现,如此往复。

试了各种办法,比如设置超时时间,在oracle数据库端配置最大连接数,设置Mybatis数据库池的连接数,发现都没有用。后来看了下BoneCP连接池配置参数,发现以下两处地方设置的有问题【回收与检测空闲连接时间设置的太大了】:

<!-- 设置connection的空闲存活时间。这个参数默认为60,单位:分钟。设置为0该功能失效。 通过ConnectionTesterThread观察每个分区中的connection,如果这个connection距离最后使用的时间大于这个参数就会被清除。 注意:这个参数仅和idleConnectionTestPeriodInSeconds搭配使用,而且不要在这里设置任何挑衅的参数! -->

<!-- 1小时回收空闲链接 -->

db.idleMaxAgeInMinutes=60

<!-- 设置测试connection的间隔时间。这个参数默认为240*60,单位:分钟。设置为0该功能失效。 通过ConnectionTesterThread观察每个分区中的connection,如果这个connection距离最后使用的时间大于这个参数并且距离上一次测试的时间大于这个参数就会向数据库发送一条测试语句,如果执行失败则将这个connection清除。注意:这个值仅和idleMaxAge搭配使用,而且不要在这里设置任何挑衅的参数! -->

<!-- 4小时检测一次空闲链接 -->

db.idleConnectionTestPeriodInMinutes=240

于是改为:

db.idleMaxAgeInMinutes=1

db.idleConnectionTestPeriodInMinutes=10

问题解决。

对于使用DBCP,C3P0, proxool数据库连接池的朋友,可以调整下config文件里的最大连接数,空闲连接回收时间以及检测时间。防止数据库连接池被爆。相信会有不错的效果。

附上

BoneCP连接池配置参数详细说明

点击打开链接

 

参数

意义

说明

一 BoneCP主要配置参数

1

jdbcUrl

设置数据库URL

 

2

username

设置数据库用户名

 

3

password

设置数据库密码

 

4

partitionCount

设置分区个数。这个参数默认为1,建议3-4(根据特定应用程序而定)。

为了减少锁竞争和改善性能,从当前线程分区(thread-affinity)中获取一个connection,也就是这个样子:partitions[Thread.currentThread().getId() % partitionCount]。当拥有充足的短期(short-lived)的线程时候,这个参数设置越大,性能越好。当超过一定的阀值时,连接池的维护工作就可能对性能造成一定的负面影响(仅当分区上的connection使用耗尽时)。

5

maxConnectionsPerPartition

设置每个分区含有connection最大个数。这个参数默认为2。如果小于2,BoneCP将设置为50。

比如:partitionCount设置为3,maxConnectionPerPartition设置为5,你就会拥有总共15个connection。注意:BoneCP不会将这些connection一起创建出来,而是说在需要更多connection的时候从minConnectionsPerPartition参数开始逐步地增长connection数

6

minConnectionsPerPartition

设置每个分区含有connection最小个数。这个参数默认为0。

 

7

acquireIncrement

设置分区中的connection增长数量。这个参数默认为1。

当每个分区中的connection大约快用完时,BoneCP动态批量创建connection,这个属性控制一起创建多少个connection(不会大于maxConnectionsPerPartition).
注意:这个配置属于每个分区的设置。

8

poolAvailabilityThreshold

设置连接池阀值。这个参数默认为20%。如果小于0或是大于100,BoneCP将设置为20。

连接池观察线程(PoolWatchThread)试图为每个分区维护一定数量的可用connection。
这个数量趋于maxConnectionPerPartition和minConnectionPerPartition之间。这个参数是以百分比的形式来计算的。例如:设置为20,下面的条件如果成立:Free Connections / MaxConnections< poolAvailabilityThreshold;就会创建出新的connection。
换句话来说连接池为每个分区至少维持20%数量的可用connection。设置为0时,每当需要connection的时候,连接池就要重新创建新connection,这个时候可能导致应用程序可能会为了获得新connection而小等一会。

9

(connectionTimeout )0.8版中替换为:connectionTimeoutInMs

设置获取connection超时的时间。这个参数默认为Long.MAX_VALUE;单位:毫秒。

在调用getConnection获取connection时,获取时间超过了这个参数,就视为超时并报异常。

二 BoneCP线程配置参数

1

releaseHelperThreads

--0.8版中已不建议使用。

设置connection助手线程个数。这个参数默认为3。如果小于0,BoneCP将设置为3。

设置为0时,应用程序线程被阻塞,直到连接池执行必要地清除和回收connection,并使connection在其它线程可用。
设置大于0时,连接池在每个分区中创建助手线程处理回收关闭后的connection(应用程序会通过助手线程异步地将这个connection放置到一个临时队列中进行处理)。
对于应用程序在每个connection上处理大量工作时非常有用。可能会降低运行速度,不过在高并发的应用中会提高性能。

2

statementReleaseHelperThreads

设置statement助手线程个数。这个参数默认为3。如果小于0,BoneCP将设置为3。

设置为0时,应用程序线程被阻塞,直到连接池或JDBC驱动程序关闭statement。
设置大于0时,连接池会在每个分区中创建助理线程,异步地帮助应用程序关闭statement当应用程序打开了大量的statement是非常有用的。可能会降低运行速度,不过在高并发的应用中会提高性能。

3

maxConnectionAge

设置connection的存活时间。这个参数默认为0,单位:毫秒。设置为0该功能失效。

通过ConnectionMaxAgeThread观察每个分区中的connection,不管connection是否空闲,如果这个connection距离创建的时间大于这个参数就会被清除。当前正在使用的connection不受影响,直到返回到连接池再做处理。

4

idleMaxAge在0.8版中替换为

idleMaxAgeInMinutes

设置connection的空闲存活时间。这个参数默认为60,单位:分钟。设置为0该功能失效。

通过ConnectionTesterThread观察每个分区中的connection,如果这个connection距离最后使用的时间大于这个参数就会被清除。注意:这个参数仅和idleConnectionTestPeriod搭配使用

5

idleConnectionTestPeriod在0.8版中替换为idleConnectionTestPeriodInMinutes

设置测试connection的间隔时间。这个参数默认为240,单位:分钟。设置为0该功能失效。

通过ConnectionTesterThread观察每个分区中的connection, 如果这个connection距离最后使用的时间大于这个参数并且距离上一次测试的时间大于这个参数就会向数据库发送一条测试语句,如果执行失败则将这个connection清除。 注意:这个值仅和idleMaxAge搭配使用,参数要适当!

三 BoneCP其他可选配置参数

1

acquireRetryAttempts

设置重新获取连接的次数。这个参数默认为5。

获取某个connection失败之后会多次尝试重新连接,如果在这几次还是失败则放弃。

2

acquireRetryDelay

设置重新获取连接的次数间隔时间。这个参数默认为7000,单位:毫秒。如果小于等于0,BoneCP将设置为1000。

获取connection失败之后再次尝试获取connection的间隔时间。

3

lazyInit

设置连接池初始化功能。这个参数默认为false。

设置为true,连接池将会初始化为空,直到获取第一个connection。

4

statementsCacheSize

设置statement缓存个数。这个参数默认为0。

 

5

disableJMX

设置是否关闭JMX功能。这个参数默认为false。

 

6

poolName

设置连接池名字。用于当作JMX和助手线程名字的后缀。

 

四 BoneCP调试配置参数

1

closeConnectionWatch

设置是开启connection关闭情况监视器功能。这个参数默认为false。

每当调用getConnection()时,都会创建CloseThreadMonitor,监视connection有没有关闭或是关闭了两次。警告:这个参数对连接池性能有很大的负面影响,慎用!仅在调试阶段使用!

2

closeConnectionWatchTimeout

设置关闭connection监视器(CloseThreadMonitor)持续多长时间。这个参数默认为0;单位:毫秒。

仅当closeConnectionWatch参数设置为可用时,设置这个参数才会起作用。
设置为0时,永远不关闭。

3

logStatementsEnabled

设置是否开启记录SQL语句功能。这个参数默认是false。

将执行的SQL记录到日志里面(包括参数值)。调试阶段会很有用.

4

queryExecuteTimeLimit

设置执行SQL的超时时间。这个参数默认为0;单位:毫秒。

当查询语句执行的时间超过这个参数,执行的情况就会被记录到日志中。
设置为0时,该功能失效。

5

disableConnectionTracking

设置是否关闭connection跟踪功能。这个参数默认为false。

设置为true,连接池则不会监控connection是否严格的关闭;设置为false,则启用跟踪功能(仅追踪通过Spring或一些事务管理等机制确保正确释放connection并放回到连接池中)。

6

transactionRecoveryEnabled

设置事务回放功能。这个参数默认为false。

设置为true时,MemorizeTransactionProxy可以记录所有在connection上操作的情况,当connetion操作失败的时候会自动回放先前的操作,如果在回放期间还是失败,则抛出异常。注意:这个功能会使连接池微弱地降低运行速度。

Spring+Mybatis+BoneCP向数据库发出请求时出现:Io 异常: Socket read timed out相关推荐

  1. 用Spring+Mybatis写一个数据库增删改查

    用Spring+Mybatis写一个数据库增删改查 总体结构 ClassBiz.java package com.gxj.biz;import java.util.List;import com.gx ...

  2. mybatis向mysql数据库插入数据时,中文乱码显示为?解决方法

    mybatis向mysql数据库插入数据时,中文乱码显示为?解决方法 1.先查看库.表.表字符字段的编码格式.MySQL默认的库和表的字符编码都是latin1,而我们一般需要使用 utf8 //先查看 ...

  3. android 请求服务器抛io异常,Android开发中与服务器交互时,遇到java.io.IOException: Target host must not be null的问题...

    当我遇到这个问题的时候,也在网上查找好半天.找到了一个和这个问题很类似的问题--java.lang.IllegalStateException: Target host must not be nul ...

  4. Spring+Mybatis+Mysql搭建分布式数据库访问框架

    一.前言 用Java开发企业应用软件, 经常会采用spring+MyBatis+MySQL搭建数据库框架.如果数据量很大,一个mysql库存储数据访问效率很低,往往会采用分库存储管理的方式.本文讲述如 ...

  5. Spring MVC 接收POST表单请求,获取参数总结

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间遇到一个问题,在spring mvc 服务端接收post请求时,通过html 表单提交的时候,服务端能够接收到参数的值 ...

  6. 高校教师工资管理系统java_基于jsp+Spring+mybatis的SSM简单院校教师工资管理系统...

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以. IDE环境: Eclipse,Myeclipse,IDEA都可以 硬件环境: windows 7/8/10 ...

  7. java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置

    java相关:mysql+spring+mybatis实现数据库读写分离的代码配置 发布于 2020-4-4| 复制链接 分享一篇关于关于mysql+spring+mybatis实现数据库读写分离的代 ...

  8. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效

    问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...

  9. Chrome浏览器对统一资源发出多个请求时,导致最多停止20s问题

    Chrome浏览器对统一资源发出多个请求时,导致最多停止20s问题 Chrome浏览器对统一资源发出多个请求时,导致最多停止20s问题 使用环境: 问题描述: 解决方案: 永久: 临时: 参考文档主要 ...

最新文章

  1. 面向对象——单例设计模式
  2. 的 while循环_十八、Python图解while循环
  3. C语言中字符数组的初始化与注意事项
  4. 15张图呈现数据库事务背后的并发原理
  5. android技巧:把自己的app变成手机系统自带的app[/system/app]
  6. HDU2097 Sky数【进制】
  7. 【CCCC】L2-005 集合相似度 (25分),维护set数组去重,比较统计
  8. 8B/10B编码(转)
  9. weblogic部署war冲突解决记录
  10. Java集合源码解读(一):集合总体框架
  11. directadmin安装
  12. null underfined NaN 判断
  13. 海外国外支付渠道接口对接
  14. Echarts Y轴遮挡解决方案
  15. C++语言的基本符号与词汇
  16. 【docker问题】Client.Timeout exceeded while awaiting header
  17. IMU、AHRS、VRU和GNSS、INS
  18. ISP AWB自动白平衡包含一段简单的色温估计进行白平衡调节的程序
  19. 使用 vue-i18n 进行Vue国际化处理,使项目切换中英文
  20. html将div放到页面最底部,关于html:我如何将div放在容器的底部?

热门文章

  1. 抓包工具Fiddler抓取手机包和修改接口数据
  2. Dialer拨号定制功能
  3. CentOS6.5安装testlink1.9.14
  4. BI+AI:窥探数据和分析的未来
  5. 密码学系列 - 棱镜门
  6. python canopen_CAN与CANOPEN在电机控制中的应用
  7. ARM7中断处理过程、状态、嵌套
  8. 程序创业会有哪些坑?
  9. 极限与连续知识点总结_知识点一(极限与连续).doc
  10. 回滚日志(undo log)介绍