in wrapper/src/main/java/software/amazon/jdbc/plugin/readwritesplitting/ReadWriteSplittingPlugin.java [281:339]
void switchConnectionIfRequired(final boolean readOnly) throws SQLException {
final Connection currentConnection = this.pluginService.getCurrentConnection();
if (currentConnection != null && currentConnection.isClosed()) {
logAndThrowException(Messages.get("ReadWriteSplittingPlugin.setReadOnlyOnClosedConnection"),
SqlState.CONNECTION_NOT_OPEN);
}
if (isConnectionUsable(currentConnection)) {
try {
this.pluginService.refreshHostList();
} catch (final SQLException e) {
// ignore
}
}
final List<HostSpec> hosts = this.pluginService.getHosts();
if (Utils.isNullOrEmpty(hosts)) {
logAndThrowException(Messages.get("ReadWriteSplittingPlugin.emptyHostList"));
}
final HostSpec currentHost = this.pluginService.getCurrentHostSpec();
if (readOnly) {
if (!pluginService.isInTransaction() && !isReader(currentHost)) {
try {
switchToReaderConnection(hosts);
} catch (final SQLException e) {
if (!isConnectionUsable(currentConnection)) {
logAndThrowException(
Messages.get("ReadWriteSplittingPlugin.errorSwitchingToReader", new Object[] { e.getMessage() }),
SqlState.CONNECTION_UNABLE_TO_CONNECT,
e);
return;
}
// Failed to switch to a reader. {0}. The current writer will be used as a fallback: ''{1}''
LOGGER.fine(() -> Messages.get(
"ReadWriteSplittingPlugin.fallbackToWriter",
new Object[] {
e.getMessage(),
this.pluginService.getCurrentHostSpec().getUrl()}));
}
}
} else {
if (!isWriter(currentHost) && pluginService.isInTransaction()) {
logAndThrowException(
Messages.get("ReadWriteSplittingPlugin.setReadOnlyFalseInTransaction"),
SqlState.ACTIVE_SQL_TRANSACTION);
}
if (!isWriter(currentHost)) {
try {
switchToWriterConnection(hosts);
} catch (final SQLException e) {
logAndThrowException(Messages.get("ReadWriteSplittingPlugin.errorSwitchingToWriter"),
SqlState.CONNECTION_UNABLE_TO_CONNECT, e);
}
}
}
}