[英]Dead Connections Returned to JDBC Connection Pool - Glassfish 3.1.2.2
我在glassfish上的jdbc连接池遇到问题,无法发出无效的数据库连接。 我正在使用jconn3(com.sybase.jdbc3)运行Glassfish 3.1.2.2以连接到Sybase 12.5。 我们的组织每晚执行一次重新引导过程,在此期间我们将重新启动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.