当前位置:网站首页>Analyse et résolution des défaillances de connexion causées par MySQL utilisant replicationconnection
Analyse et résolution des défaillances de connexion causées par MySQL utilisant replicationconnection
2022-06-23 12:42:00 【InfoQ】
Contexte du problème

Les principales configurations impliquées sont les suivantes:
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;
}
}
}
Causes profondes
Analyse des causes
mysql-jdbcMoyenne, Processus de connexion piloté par la base de données

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);
}
ReplicationConnectionProxyUne partie importante de

ReplicationConnection Processus de traitement des objets Proxy

druid Paire de sources de données MySQVérification des connexions
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);
}
}
La solution
Ajuster la version dépendante
Modifier la mise en œuvre de la séparation lecture - écriture
Développementmysql-jdbcDrive
Basé surdruid,DéveloppementMySQLVérification de la connexion
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);
}
}
边栏推荐
- MySQL使用ReplicationConnection导致的连接失效分析与解决
- ROS observation [57]: configure arm robots to grasp things
- ROS knowledge: the calling practice of librviz Library
- State machine framework
- M & A and capital increase may be expected to start Neusoft's new momentum?
- QT knowledge: detailed explanation of view frame qgraphicswidget
- What should I do if a serious bug occurs within the scope of my own test and I am about to go online?
- Halcon knowledge: binocular_ Discrimination knowledge
- C#学习(高级课程)Day13——反射
- Localization information | aikesheng and China kefangde complete product compatibility and mutual certification
猜你喜欢

ROS knowledge: point cloud files PCD format

华为云GaussDB重磅发布HTAP商用,定义云原生数据库2.0新范式

冷板式、浸没式、喷淋式液冷散热能否引领高性能计算发展?

Install rstudio desktop and rstudio server free version

Network foundation and framework

ROS知识:点云文件.pcd格式

Ecological Wanli database and Westone completed compatible certification to jointly build a network security ecosystem

Based on your work experience, talk about the quality system construction in software testing

Wallys/DR6018-S/ 802.11AX MU-MIMO OFDMA / 2* GE PORTS/WIFI 6e / BAND DUAL CONCURRENT

SQL adds the problem of duplicate table records.
随机推荐
R语言dplyr包mutate_all函数将dataframe中的所有数值数值列(变量)乘以某一固定值并生成新的数据列,为新的数据列(变量)指定自定义后缀名称
halcon原理:一维函数function_1d类型【2】
Ecological Wanli database and Westone completed compatible certification to jointly build a network security ecosystem
[introduction to UVM== > episode_7] ~ sequence, sequence item, sequencer, driver
C#学习(高级课程)Day14——特性
Ros2 knowledge (1): start practicing robots
C#学习(高级课程)Day15——异常处理和命名空间
Meta 称英国安全法将“扫描所有私人信息”,有侵犯用户隐私风险
CDH邮件报警配置
C#学习(高级课程)Day13——反射
Ablebits Ultimate Suite for Excel
halcon知识:dyn_threshold的用法(划痕检测)
The list of open source summer winners has been publicized, and the field of basic software has become a hot application this year
自己测试的范围内出现严重 BUG ,马上要上线,这种情况怎么办?
Qt5 knowledge: some key points of signals and slots
Playing in Singapore in the hot summer: an inventory of indoor attractions and good places for night trips
现在开户有优惠吗?手机开户安全么?
冷板式、浸没式、喷淋式液冷散热能否引领高性能计算发展?
Deep thinking: in-depth analysis of some scenes in Gaia Altman and the philosophy and perception reflected
Basic data type and corresponding packing class