查询时会获取连接(DruidDataSource.getConnectionDirect),在内部会检测连接的状态(DruidDataSource.testConnectionInternal),检测时使用validConnectionChecker.isValidConnection。
之前使用的是1.0.18,一切正常,看代码是使用了MySqlValidConnectionChecker 重载的校验方法。
而换成1.0.26后,连接闲置一段时间后再使用,就出现了下面的异常: ERROR com.alibaba.druid.pool.DruidDataSource:1243] discard connection com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 1,463,838 milliseconds ago. The last packet sent successfully to the server was 1,463,839 mill iseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configure d values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 跟代码发现在这个版本中,没有使用到MySqlValidConnectionChecker 的校验方法,而是父类ValidConnectionCheckerAdapter 的,而由于我们的配置没有配置校验用的sql,直接返回了true(表示连接有效),导致问题的发生。 为什么没用到父类的呢?因为父类没有重写该方法,原来方法的名字被改为了“validConnection”。
首先,我们如果配置了校验用的sql,也就不会有这个问题(这个没有亲自测试),于是这个issue可能也算不上是bug。 比较关心的是,这个validConnection看源码并没有地方使用到,修改时间是2016年5月31日,使用父类的而不是MySQL的实现,出发点是什么呢?
请百忙之中解答下,谢谢!
原提问者GitHub用户tsubasa617
如果您在使用1.0.26版本的MyBatis时遇到了MySQL连接断开未重连的问题,可能是因为MyBatis中的MySQL连接检测实现不够稳定或者不适用于某些特定场景。以下是一些可能的解决方法:
检查MySQL连接配置
请检查您的MySQL连接配置,确保配置正确。特别注意以下几个配置项:
url
username
password
这些配置项对于数据库连接非常重要,如果不正确,可能会导致无法连接数据库或者连接不稳定。
调整MySQL连接检测方式
默认情况下,MyBatis会使用通用的连接检测方式来检测MySQL连接的有效性。如果您认为这种检测方式不适用于您的应用程序,可以尝试使用其他的检测方式。例如,您可以在MyBatis的配置文件中添加以下配置:
xml
Copy
这将启用空闲连接检测,并定期检测连接的有效性。如果连接断开,MyBatis将自动重新连接到MySQL数据库。
使用连接池
如果您的应用程序需要频繁地连接MySQL数据库,可以考虑使用连接池来管理数据库连接。连接池可以帮助您管理连接的生命周期,并提高连接的复用率。MyBatis支持多种连接池,例如Apache Commons DBCP、C3P0、Druid等。
根据你提供的信息,问题可能是由于连接池配置的一些设置引起的。以下是几个可能导致问题的原因和解决方法:
验证查询语句的问题:确保validationQuery的值是一个有效的SQL SELECT语句,并且可以正常返回结果。请确认数据库中的SELECT 'x'查询可以正常执行。
测试连接的设置问题:将testWhileIdle设置为true,以确保空闲连接在返回给调用者之前进行验证。此外,testOnBorrow和testOnReturn可以设置为true,以在从连接池获取连接和归还连接时验证连接的有效性。
连接池其他相关设置的问题:确保其他连接池的配置属性与你的需求一致,并且没有冲突。需要特别关注minEvictableIdleTimeMillis和removeAbandonedTimeout等参数。
如果以上解决方法无效,还可以尝试以下步骤进行问题排查:
检查数据库连接是否正常工作,确保数据库服务器可用,并且网络连接没有问题。
查看数据库的日志文件,以了解更多关于通信连接失败的详细信息。可能是由于网络问题、防火墙设置等引起的。
检查应用程序的日志文件,查看是否有其他与数据库连接相关的错误或异常。
如果问题仍然存在,建议进一步调试和排查。可能需要与相应的数据库管理员或开发人员合作,以检查配置和应用程序的更多细节。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。