JDBC链接中的参数autoReconnect到底生效吗?
背景
总看到有说autoReconnect不生效的问题,自己也碰到过这个坑,特此记录。这是度娘给出来的一些结果。
先说答案
答案是肯定生效的,但是有一些注意事项如果没处理好就会导致不生效。并且即便生效了,也有一些小坑需要处理,所以官方意见是不推荐用这个参数的。测试用例中只用了jdbc和mysql-connector-java(V8.0.25), mysql(V5.7)。
在链接断开后不能重新建立链接的可能原因
可能存在的原因有如下几种,请自行检查。
- 异常捕获范围不对,只捕获了statement.executeXXX(),但是ResultSet不在捕获范围内,导致取结果集的时候出现异常,导致程序退出。可以额外声明捕获CommunicationsException异常来单独查看情况。
- 断开链接时间过长,导致在有效的重试次数内没有建立连接从而放弃。会报这个错误 java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. 如果是这种情况可以通过在DB_URL中增加maxReconnects和initialTimeout来修改重试的次数和间隔时间。
- 有其他文章提到增加 failOverReadOnly=false 这个配置来时重连生效,是不对的。从源码和试验中得出的结论是这个参数是用来在断线的情况下切换到新的数据库才会生效。因为在多数据与情况下经常是一主多从,所以默认切换到其他数据源会改为只读,但是和在数据源情况下是否可以断线重连没有任何关系。
需要注意事项:
- 在重连成功后,之前断开连接时候执行的事务可能会直接放弃。
- 官方不建议用这个参数,详见讨论 https://bugs.mysql.com/bug.php?id=5020
问题来了
在生产环境,数据库连接断了应该怎么办?嘿,评论去留下你的方案或技术栈呗~
文章评论