繁体   English   中英

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

[英]Dead Connections Returned to JDBC Connection Pool - Glassfish 3.1.2.2

我在上的连接池遇到问题,无法发出数据库连接。 我正在使用jconn3(com.sybase.jdbc3)运行Glassfish 3.1.2.2以连接到Sybase 12.5。 我们的组织每晚执行一次重新引导过程,在此期间我们将重新启动Sybase服务器。 当在重新启动过程中尝试使用数据库连接时,我的问题显现出来。 以下是产生我的问题的操作顺序:

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

    我知道池上有一个设置,因此您可以在分发数据库之前对数据库连接进行验证,但是出于性能原因,我对此不屑一顾。 我的流程每天执行大约500万次数据库事务。

    我的问题是,是否有人知道首先避免将无效连接返回到池中的方法?

    您已经很好地总结了选择。 我们遇到了这个问题,午夜数据库崩溃了。 对于我们来说,我们启用了连接验证,但没有您的交易量。

    Glassfish提供了一个自定义验证选项,可以使用该选项指定一个类来进行验证。

    默认情况下,Glassfish提供的所有类都可以执行(您将在控制台中看到它们作为选项提供)是这样的SQL语句:

    SELECT 1;
    

    数据库之间的语法略有不同,SQL Server使用'1',而对于Postgres,仅使用1。但是意图是相同的。

    最终,每次尝试建立连接时,都会付出额外的数据库命中费用,但这确实是非常便宜的命中。 但是仍然很受欢迎。

    但是您可以实现自己的版本。 它可以执行检查,例如,每10个请求一次,甚至更少一次。 将随机数从1滚动到N(N = 10、20、100 ...),如果得到的是“ 1”,请执行选择(如果失败,则失败),否则返回“ true”。 但同时,对其进行配置,以便如果您确实检测到错误,请清除整个池。 显然,对它进行了调整,因此与数据库峰值处理相比,当数据库在晚上宕机(不知道您的系统晚上有多忙)时,您很有可能会发生这种情况。

    您甚至可以在峰处理过程中“降低几率”。 “如果凌晨6点至下午6点之间的时间,则赔率= 1000,否则赔率= 100;如果(random(odds)== 1){请选择...}”

    随机选项消除了维护线程安全计数器的需要。

    最后,这并不重要,您只需要及时注意数据库已关闭,就可以要求GF中止该池。

    我可以肯定地看到,在数据库启动时,它在开始时就有些混乱,可能不止刷新一次池,但这应该是无害的。

    您可以使用不同的方式进行操作,但这是考虑的途径。

    暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM