很多时候,数据库可能配置了HA,比如keepalived、heartbeat 、MHA、DBproxy、atlas等。这样在主库宕机时,slave节点能很快接管主库的服务,但是如果使用了Java连接池,这样Jboss是默认配置的话,连接池建立的长连接会失效!这时DB是OK的,应用服务器到DB会建立新的连接,但老的连接并没有释放掉,程序访问时会拿到失效连接导致程序异常,紧急情况下SA们为了解决问题可能会重启Jboss即可恢复正常,但排查应用日志报数据库连接失败,追究责任的话DB肯定也脱不了干系的。怎么办呢?直接贴配置吧:
<validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/> <check-valid-connection-sql>select 1</check-valid-connection-sql> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/> </validation>
Jboss里设置自动重连配置项的话,一旦DB 重启或者VIP发生漂移,应用服务器就不会受到影响了。
关于Jboss配置项的含义可参照 :https://developer.jboss.org/wiki/ConfigDataSources
MySQL手册上建议的Jboss配置为:
http://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-jboss.html