Как я могу управлять переключением БД для запросов на запись?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как я могу управлять переключением БД для запросов на запись?

Сообщение Anonymous »


Spring Boot версии 3.2
Java версии 17
org.apache.tomcat.jdbc.pool.DataSource(tomcat-jdbc-10.1.16)

Мы определяем источник данных следующим образом

@Бин общедоступный источник данных dataSource() { Источник данных ds = новый источник данных(); ds.setDriverClassName(driverMapping.get(dbType)); ds.setUrl(dbUrl); ds.setUsername(dbUsername); ds.setPassword(decryptPassword(dbPassword)); ds.setInitialSize(initialSize); ds.setMaxActive(maxActive); ds.setMaxIdle(maxIdle); ds.setMinIdle(minIdle); ds.setTestWhileIdle(testWhileIdle); ds.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); ds.setTimeBetweenEvictionRunsMillis(timeBetweenEvicRunsMillis); ds.setTestOnBorrow(testOnBorrow); если (StringUtils.isNotBlank (validationQuery)) { ds.setValidationQuery(validationQuery); } Еще если (dbType.equalsIgnoreCase(Constants.Database.ORACLE)) { ds.setValidationQuery("ВЫБЕРИТЕ 1 ИЗ ДВОЙНОГО"); } еще { ds.setValidationQuery("ВЫБРАТЬ 1"); } ds.setValidationInterval(validationInterval); ds.setRemoveAbandoned(removeAbandoned); ds.setRemoveAbandonedTimeout(removeAbandonedTimeOut); ds.setMaxAge(maxAge); ds.setLogValidationErrors(logValidationErrors); вернуть дс; } Теперь перейдем к реальной проблеме: у нас есть настройка высокой доступности, в которой БД также находится в среде высокой доступности. В этом случае ведущее устройство будет иметь все права на чтение/запись/удаление, а ведомое устройство сможет выполнять только операции чтения. В некоторых случаях произошло переключение БД и мастер отключился.

@Value("${db.min-idle:5}") Теперь количество бездействующих соединений равно 5, и мы предполагаем, что при сбое базы данных в базу данных отправляется некоторый запрос на обновление, и он завершается с ошибкой

ОШИБКА | ОШИБКА: невозможно выполнить UPDATE в транзакции только для чтения

Мы рассматриваем простое соединение, удерживающее соединение с БД с главным узлом, и оно соединяется с БД, доступной только для чтения (главный узел, который стал подчиненным после аварийного переключения БД) для операции обновления, которая вызывает исключение.

Здесь источник данных будет проверять простаивающее соединение перед назначением его приложению, но только с помощью запроса SELECT, поэтому, если новое соединение назначается из пула, оно может указывать только на главное соединение, которое становится подчиненным. сейчас и только для чтения. Теперь все вызовы обновления базы данных завершатся неудачно.

Можно ли решить эту проблему с помощью Spring Boot/DataSource с помощью более качественной логики?

Примечание. Это развертывание контейнера, поэтому я не могу создать два отдельных источника данных. Подключаем БД из приложения Springboot через сервисный объект k8s.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»