应用使用了Druid去链接Oracle数据库,奇怪的事情发生了:应用在一段不活跃的时间之后(即在这段时间内没有访问这个应用),再次访问应用时,后台dblog显示:
2016-02-26 14:06:34.306 DEBUG http-bio-9002-exec-9 org.apache.ibatis.transaction.jdbc.JdbcTransaction 132 openConnection - Opening JDBC Connection... 2016-02-26 14:22:09.620 DEBUG http-bio-9002-exec-9 com.alibaba.druid.support.logging.Log4j2Impl 63 debug - skip not validate connection. 2016-02-26 14:22:09.750 DEBUG http-bio-9002-exec-9 org.apache.ibatis.transaction.jdbc.JdbcTransaction 137 openConnection - JDBC connection is [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@47254e47]
要过很长时间才能重新链接到db,难道防火墙在超过一定的时间之后,会自动断开链接?
原提问者GitHub用户triffic-tang
在使用Druid连接Oracle数据库时,长时间不活跃时自动断开连接的问题可能是由于Oracle数据库的TCP/IP超时设置导致的。TCP/IP超时设置是指在一段时间内没有数据传输时,系统会自动断开TCP/IP连接,以避免无意义的连接占用资源。
在Oracle数据库中,默认的TCP/IP超时设置比较短,通常为2小时左右。如果应用程序长时间不活跃,超过了TCP/IP超时设置的时间,数据库会自动断开连接,从而导致应用程序无法访问数据库。
为了解决这个问题,可以尝试调整Oracle数据库的TCP/IP超时设置。具体来说,可以通过修改SQLNET.ORA文件中的TCP.INVITED_NODES参数来调整TCP/IP超时设置。
问题已经变相解决了。回复一下,让后来者有个参考。 环境是:oracle 11g + tomcat8.35.2 + druid1.1.10 + jfinal-java8-3.4,linux CentOS 6.5。
反复尝试改变 druid 的参数(初始连接池大小、最小空闲连接数、连接等待超时的时间、指定每个连接上PSCache的大小)都不成。
最后,写了一个轮循,每分钟执行 select 1 from dual; SQL 语句,使其保持有效连接,观察了 1 天没有问题。
话说,druid 在新申请连接时检查是否有效,那么再检查空闲连接时,也检查一下是否有效,是不是就解决了这个问题呢?免的开发者再写一个轮循了。
原回答者GitHub用户yufeng217
Druid连接池默认情况下会对连接进行验证,以确保连接的有效性。当连接空闲一段时间后重新使用时,Druid会尝试验证连接的有效性。在验证连接的过程中,如果连接已经被数据库服务器断开或者连接超时,Druid会关闭该连接,并从连接池中移除。
在您的情况下,后台dblog显示"skip not validate connection",意味着Druid连接池在验证连接时发现连接已经被关闭或超时,但是由于配置了跳过验证,所以没有进行连接验证的操作。
在默认情况下,Druid连接池会使用testWhileIdle
参数来控制连接的验证行为。如果设置为true(默认值),则在连接空闲时会进行验证。您可以检查Druid连接池的配置,查看该参数的值。
另外,防火墙或其他网络设备可能对连接进行了超时设置,当连接空闲时间超过该设定时间时,网络设备可能会主动关闭连接。这可能是导致长时间不活跃后重新访问时连接无法建立的原因之一。您可以与网络团队或系统管理员联系,了解是否有这样的超时设置。
为了解决这个问题,您可以尝试以下方法:
调整Druid连接池的配置,确保testWhileIdle
参数设置为true,以便在连接空闲时进行验证。
检查防火墙或其他网络设备的配置,了解是否有连接超时的设置,并与相关团队协商调整。
考虑在应用程序中增加定时任务或定时操作,以保持连接的活跃状态,避免长时间不活跃导致连接被关闭。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。