死连接返回到JDBC连接池-Glassfish 3.1.2.2

死连接返回到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 3.1.2.2,使用jconn3(com.sybase.jdbc3)连接到sybase 12.5。我们的组织有一个每晚重新启动的过程,在此期间我们重新启动Sybase服务器。我的问题在重新启动期间尝试使用数据库连接时表现出来。以下是生成我的问题的操作顺序:

  • Sybase已关闭以重新启动
  • 已从池请求连接
  • 数据库操作按预期失败
  • 连接以关闭状态返回到池
  • Sybase已备份
  • 已从池请求连接
  • 由于“连接已关闭”异常,数据库操作失败
  • 连接返回到池
  • 我已经实现了一个数据库恢复单例,它试图从这个场景中恢复。每当发生数据库异常时,我都会调用jmx来暂停所有队列,并在JDBC连接池上执行flushConnectionPool操作。如果数据库连接仍未建立,进程将设置一个计时器,在10分钟内重试。虽然这一过程可行,但并非没有缺陷

    我意识到池上有一个设置,这样您就可以在分发数据库连接之前要求对其进行验证,但出于性能原因,我一直回避这个设置。我的进程每天执行大约500万个数据库事务


    我的问题是,有没有人知道一种方法可以避免将死连接返回到池中?

    您已经很好地总结了您的选择。我们遇到了那个问题,午夜的分贝响了。对于我们,我们打开了连接验证,但没有您的事务量

    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>