Skip to content

Commit

Permalink
Fix communication failures with aws-secretsmanager-jdbc
Browse files Browse the repository at this point in the history
Using aws-secretsmanager-jdbc with HikariCP triggers sporadic
communication link failures with MySQL.

aws-secretsmanager-jdbc library provides JDBC drivers to retrieve
DB credentials, host and password from the Amazon Secrets Manager.
See:

- https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html
- https://github.com/aws/aws-secretsmanager-jdbc

By specifying the secret id as a JDBC an URL, and
com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver as
JDBC driver, HikariCP can connect to the MySQL endpoint.

But in this stituation, communication link failures occur:
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet successfully received from the server was 5,006 milliseconds ago.
The last packet sent successfully to the server was 5,007 milliseconds ago.

These failures are due a MySQL bug: http://bugs.mysql.com/bug.php?id=75615 which is
bypassed by HikariCP when the MySQL driver is used. See:

 - #236
 - 8af2bc5 (Fix #236 via workaround for MySQL issue http://bugs.mysql.com/bug.php?id=75615, 2015-01-24)

This commit applies the same hack for AWSSecretsManagerMySQLDriver.
  • Loading branch information
gontard committed May 2, 2022
1 parent a9147ee commit b027d98
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions src/main/java/com/zaxxer/hikari/pool/PoolBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ else if (dataSourceJNDI != null && ds == null) {

if (ds != null) {
setLoginTimeout(ds);
createNetworkTimeoutExecutor(ds, dsClassName, jdbcUrl);
createNetworkTimeoutExecutor(ds, dsClassName, jdbcUrl, driverClassName);
}

this.dataSource = ds;
Expand Down Expand Up @@ -589,12 +589,13 @@ private void executeSql(final Connection connection, final String sql, final boo
}
}

private void createNetworkTimeoutExecutor(final DataSource dataSource, final String dsClassName, final String jdbcUrl)
private void createNetworkTimeoutExecutor(final DataSource dataSource, final String dsClassName, final String jdbcUrl, final String driverClassName)
{
// Temporary hack for MySQL issue: http://bugs.mysql.com/bug.php?id=75615
if ((dsClassName != null && dsClassName.contains("Mysql")) ||
(jdbcUrl != null && jdbcUrl.contains("mysql")) ||
(dataSource != null && dataSource.getClass().getName().contains("Mysql"))) {
(dataSource != null && dataSource.getClass().getName().contains("Mysql")) ||
"com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver".equals(driverClassName)) {
netTimeoutExecutor = new SynchronousExecutor();
}
else {
Expand Down

0 comments on commit b027d98

Please sign in to comment.