死连接返回到JDBC连接池-Glassfish 3.1.2.2
我在分发死掉的数据库连接时遇到了连接池问题。我正在运行Glassfish 3.1.2.2,使用jconn3(com.sybase.jdbc3)连接到sybase 12.5。我们的组织有一个每晚重新启动的过程,在此期间我们重新启动Sybase服务器。我的问题在重新启动期间尝试使用数据库连接时表现出来。以下是生成我的问题的操作顺序:死连接返回到JDBC连接池-Glassfish 3.1.2.2,jdbc,glassfish,java,jakarta-ee,connection-pooling,Jdbc,Glassfish,Java,Jakarta Ee,Connection Pooling,我在分发死掉的数据库连接时遇到了连接池问题。我正在运行Glassfish 3.1.2.2,使用jconn3(com.sybase.jdbc3)连接到sybase 12.5。我们的组织有一个每晚重新启动的过程,在此期间我们重新启动Sybase服务器。我的问题在重新启动期间尝试使用数据库连接时表现出来。以下是生成我的问题的操作顺序: Sybase已关闭以重新启动 已从池请求连接 数据库操作按预期失败 连接以关闭状态返回到池 Sybase已备份 已从池请求连接 由于“连接已关闭”异常,数据库操作失败
我的问题是,有没有人知道一种方法可以避免将死连接返回到池中?您已经很好地总结了您的选择。我们遇到了那个问题,午夜的分贝响了。对于我们,我们打开了连接验证,但没有您的事务量 Glassfish提供了一个定制的验证选项,通过该选项可以指定一个类来进行验证 默认情况下,Glassfish提供的所有类(您将在控制台中看到它们作为选项提供)都是如下所示的SQL语句:
SELECT 1;
数据库之间的语法略有不同,SQL Server使用“1”,而对于Postgres,它只使用1。但目的是一样的
网络是,每次你尝试连接时,它都会花费你额外的DB命中率,但这是一个非常非常便宜的命中率。但是,它仍然很成功
但是您可以实现自己的版本。比如说,它可以每10次请求进行一次检查,甚至更不频繁。将随机数从1滚动到N(N=10、20、100…),如果得到“1”,则进行选择(如果失败,则失败),否则返回“true”。但同时,对其进行配置,以便在检测到错误时清除整个池。显然,调整这一点,这样当您的数据库在夜间下降(不知道您的系统在夜间有多忙)而不是峰值处理时,您就有很好的机会发生这种情况
您甚至可以在峰值处理期间“降低几率”。“如果时间在早上6点到下午6点之间,则赔率=1000,否则赔率=100;如果(随机(赔率)==1){请选择…}”
随机选项消除了维护线程安全计数器的需要
最后,这并不重要,您只需要及时注意数据库已关闭,以便您可以要求GF中止池
我可以肯定地看到,当DB出现时,它在一开始就有点颠簸,可能会多次刷新池,但这应该是无害的
<>你可以玩不同的方式,但这是一个需要考虑的途径。< /P>