java - Tomcat 连接池问题 - 无法在关闭的连接上调用方法
问题描述
我的应用程序使用 Spring 2.5.x 并部署在 Tomcat 服务器上。有时,当我的数据库连接空闲时,我会收到以下错误:
[TeraJDBC 14.00.00.13] [错误 1095] [SQLState HY000] 无法在关闭的连接上调用方法
这是数据源配置
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
destroy-method="close">
<property name="driverClassName" value="com.teradata.jdbc.TeraDriver"/>
<property name="url" >
<util:constant static-field="_DB_HOST"/>
</property>
<property name="username">
<util:constant static-field="_DB_USER"/>
</property>
<property name="password">
<util:constant static-field="_DB_PWD"/>
</property>
<property name="initialSize" value="1" />
<property name="maxActive" value="50" />
</bean>
我在这里缺少任何配置吗?
解决方案
虽然 Spring 使用的所有连接JdbcTemplate
都在每个事务结束时关闭,但 Tomcat 的JDBC 连接池实际上从不返回Connection
驱动程序获得的 real 。DataSource#getConnection
总是返回一个代理,以便Connection#close
返回到池的连接而不是物理关闭它。
因此,正如本答案中所解释的,连接可能已被服务器关闭。因此,您需要配置池以验证连接,如Kayaman 引用的答案。
我怀疑您的问题不是由连接问题引起的,而是由服务器策略引起的,所以我会设置:
<property name="validationQuery" value="SELECT 66353343" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
为了每 60 秒检查一次物理连接是否正常。
推荐阅读
- tomcat - 如何在tomcat 7上部署战争
- javascript - 如何记住分页刷新滚动位置
- python - 如何检查 Scrapy 中是否存在按钮?
- c++ - C++ Char 类运算符<函数比较
- python - 我在哪里保存我想在 Julia 中调用的 python 文件?
- google-data-studio - 如何在 Google Data Studio 中隐藏面积图和折线图中的轴条
- html - 在 transform=rotate () 上添加了不必要的/幽灵填充
- c++ - 如何在 c++ 的析构函数中为合并的 LL 正确释放内存?
- flutter - An InputDecorator, which is typically created by a TextField, cannot have an unbounded width
- css - 如何让这个容器在 React Native 上居中