在项目“物业报修系统”里,框架是SpringMVC/Spring/MyBatis,而MyBatis在底层调用的是c3p0,我在试图优化c3p0时犯了一些错误,访问数据库时有时会超时,有时不会,超时会抛出以下异常:
1 | org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: |
我先是检查代码逻辑,没发现哪个地方会出错,再看Spring配置里关于c3p0的部分:
1 | <!--c3p0连接池的私有属性--> |
咋一眼看过去,找不到错误,我这时想起我的数据库放在阿里云上,我想:“会不会是运行数据库的机器配置不好,没法及时响应我请求?”。于是我加了一条initialPoolSize
优化选项,在建立与数据库的连接时,试图建100个(我想,建立这么多连接,怎么地也会成功一个吧),配置如下:
1 | <!--试图进行的优化--> |
优化之后,虽然效果好了一些,但偶尔依旧会有超时的情况,于是我再仔细研究代码和配置,直到我发现了上面那些配置里有一条:
1 | <property name="checkoutTimeout" value="1024"/> |
将获取连接的超时时间设置为1024毫秒,在1秒多一点的时间里如果没获取到连接就返回失败并抛出异常。
此时,我突然反应过来:远程机器那么渣,在10秒内能和远在千里之外的它建立连接我就该嗨皮了,居然还要求1秒就建立成功,失败是正常的,能成功都是运气。
于是我将它注释掉,也注释掉之前加上去的initialPoolSize
优化,如下:
1 | <!--<property name="initialPoolSize" value="100"/>--> |
如此,再也不会超时了。