当前位置:网站首页>MySQL使用ReplicationConnection导致的连接失效分析与解决
MySQL使用ReplicationConnection导致的连接失效分析与解决
2022-06-23 12:17:00 【InfoQ】
问题背景

涉及的主要配置如下:
if (testWhileIdle) {
final DruidConnectionHolder holder = poolableConnection.holder;
long currentTimeMillis = System.currentTimeMillis();
long lastActiveTimeMillis = holder.lastActiveTimeMillis;
long lastExecTimeMillis = holder.lastExecTimeMillis;
long lastKeepTimeMillis = holder.lastKeepTimeMillis;
if (checkExecuteTime
&& lastExecTimeMillis != lastActiveTimeMillis) {
lastActiveTimeMillis = lastExecTimeMillis;
}
if (lastKeepTimeMillis > lastActiveTimeMillis) {
lastActiveTimeMillis = lastKeepTimeMillis;
}
long idleMillis = currentTimeMillis - lastActiveTimeMillis;
long timeBetweenEvictionRunsMillis = this.timeBetweenEvictionRunsMillis;
if (timeBetweenEvictionRunsMillis <= 0) {
timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
}
if (idleMillis >= timeBetweenEvictionRunsMillis
|| idleMillis < 0 // unexcepted branch
) {
boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
if (!validate) {
if (LOG.isDebugEnabled()) {
LOG.debug("skip not validate connection.");
}
discardConnection(poolableConnection.holder);
continue;
}
}
}
本质原因
原因分析
mysql-jdbc中,数据库驱动对连接的处理过程

public static ReplicationConnection createProxyInstance(List<String> masterHostList, Properties masterProperties, List<String> slaveHostList,
Properties slaveProperties) throws SQLException {
ReplicationConnectionProxy connProxy = new ReplicationConnectionProxy(masterHostList, masterProperties, slaveHostList, slaveProperties);
return (ReplicationConnection) java.lang.reflect.Proxy.newProxyInstance(ReplicationConnection.class.getClassLoader(), INTERFACES_TO_PROXY, connProxy);
}
ReplicationConnectionProxy的重要组成

ReplicationConnection代理对象处理过程

druid数据源对MySQ连接的检查
public boolean isValidConnection(Connection conn, String validateQuery, int validationQueryTimeout) throws Exception {
if (conn.isClosed()) {
return false;
}
if (usePingMethod) {
if (conn instanceof DruidPooledConnection) {
conn = ((DruidPooledConnection) conn).getConnection();
}
if (conn instanceof ConnectionProxy) {
conn = ((ConnectionProxy) conn).getRawObject();
}
if (clazz.isAssignableFrom(conn.getClass())) {
if (validationQueryTimeout <= 0) {
validationQueryTimeout = DEFAULT_VALIDATION_QUERY_TIMEOUT;
}
try {
ping.invoke(conn, true, validationQueryTimeout * 1000);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
if (cause instanceof SQLException) {
throw (SQLException) cause;
}
throw e;
}
return true;
}
}
String query = validateQuery;
if (validateQuery == null || validateQuery.isEmpty()) {
query = DEFAULT_VALIDATION_QUERY;
}
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
if (validationQueryTimeout > 0) {
stmt.setQueryTimeout(validationQueryTimeout);
}
rs = stmt.executeQuery(query);
return true;
} finally {
JdbcUtils.close(rs);
JdbcUtils.close(stmt);
}
}
public MySqlValidConnectionChecker(){
try {
clazz = Utils.loadClass("com.mysql.jdbc.MySQLConnection");
if (clazz == null) {
clazz = Utils.loadClass("com.mysql.cj.jdbc.ConnectionImpl");
}
if (clazz != null) {
ping = clazz.getMethod("pingInternal", boolean.class, int.class);
}
if (ping != null) {
usePingMethod = true;
}
} catch (Exception e) {
LOG.warn("Cannot resolve com.mysql.jdbc.Connection.ping method. Will use 'SELECT 1' instead.", e);
}
configFromProperties(System.getProperties());
}
@Override
public void configFromProperties(Properties properties) {
String property = properties.getProperty("druid.mysql.usePingMethod");
if ("true".equals(property)) {
setUsePingMethod(true);
} else if ("false".equals(property)) {
setUsePingMethod(false);
}
}
解决方式
调整依赖版本
修改读写分离实现
拓展mysql-jdbc驱动
基于druid,拓展MySQL连接检查
public class MySqlReplicationCompatibleValidConnectionChecker extends MySqlValidConnectionChecker {
private static final Log LOG = LogFactory.getLog(MySqlValidConnectionChecker.class);
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public boolean isValidConnection(Connection conn, String validateQuery, int validationQueryTimeout) throws Exception {
if (conn.isClosed()) {
return false;
}
if (conn instanceof DruidPooledConnection) {
conn = ((DruidPooledConnection) conn).getConnection();
}
if (conn instanceof ConnectionProxy) {
conn = ((ConnectionProxy) conn).getRawObject();
}
if (conn instanceof ReplicationConnection) {
try {
((ReplicationConnection) conn).ping();
LOG.info("validate connection success: connection=" + conn.toString());
return true;
} catch (SQLException e) {
LOG.error("validate connection error: connection=" + conn.toString(), e);
throw e;
}
}
return super.isValidConnection(conn, validateQuery, validationQueryTimeout);
}
}
边栏推荐
- The list of open source summer winners has been publicized, and the field of basic software has become a hot application this year
- Excel-VBA 快速上手(一、宏、VBA、过程、类型与变量、函数)
- Qt知识:视图框架QGraphicsWidget详解
- 用户行为建模
- kubernetes comfig subpath
- 「开发者说」钉钉连接器+OA审批实现学校学生假勤场景数字化
- An idea of using keep alive to cache data in vue3 form pages
- ROS知识:librviz库的调用实践
- 国产化信息 | 爱可生与中科方德完成产品兼容互认证
- [no title] 2022 pressure pipeline patrol inspection and maintenance test questions and online simulation test
猜你喜欢

QT5知识:字符串列表QStringListModel

ROS knowledge: reading point cloud data files

Transformers are RNNs (linear transformer)论文阅读

「开发者说」钉钉连接器+OA审批实现学校学生假勤场景数字化

ROS2知识(2):网络设施

Stimulsoft Ultimate Reports 2022.3.1

Halcon知识:binocular_disparity 知识

QT5知识:信号和槽的一些要点

HMS core video editing service has the ability to open templates, helping users get the same cool video with one click

跟循泰国国内游宣传曲MV,像本地人一样游曼谷
随机推荐
简历的项目经历,测试人员书写要注意的几个问题
&lt;Sicily&gt;1000. 数字反转
冷板式、浸没式、喷淋式液冷散热能否引领高性能计算发展?
C#部分——值类型和引用类型
Halcon principle: Auto_ Threshold operator
Voice module: pyttsx sound change project
Shell process control - 39. Special process control statements
How to uninstall and reinstall gazebo
跟循泰国国内游宣传曲MV,像本地人一样游曼谷
kubernetes comfig subpath
Qt 知识:使用 QGraphicsPixmapItem类
ROS knowledge: point cloud files PCD format
ROS observation [51]: how to integrate odometer and IMU with robots_ Localization convergence
协程
CDH邮件报警配置
2022 construction worker - decoration direction - post skills (construction worker) operation certificate examination question bank simulated examination platform operation
ROS knowledge: the calling practice of librviz Library
halcon原理:一维函数function_1d类型【2】
ROS2知识(6):坐标对象TF原理和实践
深入思考:《盖亚奥特曼》中部分情景深度分析及反射出的哲理与感悟