Установив параметр failOverReadOnly=false
, вы можете запретить аварийному соединению находиться в режиме только для чтения.Также используйте com.mysql.jdbc.ReplicationDriver
или сообщите свой URL-адрес соединения jdbc для внутреннего выбора драйвера, задав URL-адрес, например jdbc:mysql:replication://<your url...>
В тестовой среде с двумя экземплярами базы данных mysql (порт 3306 и 3307) я использовал следующее соединение jdbcurl:
jdbc:mysql:replication://address=(type=master)(protocol=tcp)(host=localhost)(port=3306),address=(type=master)(protocol=tcp)(host=localhost)(port=3307)/test?autoReconnect=true&connectTimeout=50&failOverReadOnly=false&allowMasterDownConnections=true" />
Дополнительные параметры см. в Свойства для Connector / J .
В конфигурации используются мастера балансировки нагрузки .Если первый мастер выходит из строя, второй мастер обрабатывает весь трафик, пока первый мастер не выйдет снова (и наоборот).Я не эксперт по базам данных, но я бы не рекомендовал такую конфигурацию для производственного использования, потому что, по-моему, транзакция вашего приложения не знает о состоянии внутренней репликации базы данных.
Что вам действительно нужно решение без мастеров с балансировкой нагрузки .Это можно сделать с помощью пула соединений.Я использовал встроенные функции org.apache.commons.dbcp2.BasicDataSource
, но у него есть один недостаток : пул создается только один раз и доступен только до тех пор, пока не отключится первый мастер.На втором хозяине не будет бассейна.Возможно, на это поведение может повлиять расширение BasicDataSource с помощью собственной логики, я еще не полностью протестировал его.
Я рекомендую перезапустить ваше приложение (это создаст новый пул соединений) после того, как вы закончите с обслуживанием.Во время обслуживания ваше приложение может работать медленнее из-за того, что соединения создаются на основе запросов, а не извлекаются из пула, но у вас не будет простоев приложений (если ваше приложение кластеризовано).
Вот код:
<beans:bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url"
value="jdbc:mysql://address=(protocol=tcp)(host=localhost)(port=3306)(type=master),address=(protocol=tcp)(host=localhost)(port=3307)(type=master)/test?autoReconnect=true&connectTimeout=5&failOverReadOnly=false&allowMasterDownConnections=true" />
<beans:property name="username" value="myDBUser" />
<beans:property name="password" value="myPassword" />
<beans:property name="initialSize" value="10"/>
</beans:bean>
Обратите внимание, что ReplicationDriver
не используется, BasicDataSource
управляет переключением при сбое.
Michael