Отказоустойчивость MySQL Fabric и пул соединений с Hibernate
Я пытаюсь реализовать автоматическое переключение при сбое через MySQL Fabric Server Group, используя JNDI Resource, Hibernate и Connection Pooling. Наша ферма БД правильно настроена на MySQL Fabric, и я пытаюсь реализовать клиент / коннектор.
У меня есть ресурс JNDI, объявленный в моем файле server.xml, который имеет URL-адрес и драйвер на основе MySQL Fabric и использует пул соединений в режиме гибернации.
<Resource
name="jdbc/myApp"
type="javax.sql.DataSource"
driverClassName="com.mysql.fabric.jdbc.FabricMySQLDriver"
maxWait="1000"
url="proper.fabric.url/fabricServerGroup=myFabricGroup"
maxActive="45"
validationQuery="select 1 from dual"
/>
У меня проблема в том, что пул соединений и Fabric не очень хорошо играют вместе. После удаления главной базы данных, Fabric автоматически продвигает ведомого, как и ожидалось. Тем не менее, когда я пытаюсь установить новое соединение с БД, я возвращаю старые несуществующие соединения, в первую очередь, я получаю соединение только для чтения, когда запрашиваю readwrite. В качестве дополнительной информации, если я перезагружаю свой сервер Tomcat и запрашиваю новое соединение, я получаю правильные результаты. Проблема, с которой я столкнулся, возникает из-за пула соединений.
Что мне нужно знать, так это наличие пары ключ / значение, которая мне не хватает, которая сделала бы мой FabricDriver достаточно умным, чтобы знать, как стереть пул соединений при автоматическом переключении при сбое.
Лучшее, что я нашел, - это использование testOnBorrow, который, к сожалению, может использовать только запрос SELECT (через validationQuery), который все еще успешно выполняется, когда я получаю соединение только для чтения обратно, несмотря на запрос readwrite.
Кто-нибудь решил эту проблему раньше?
Примечание. Если я попытаюсь использовать com.mysql.fabric.jdbc.FabricMySQLDataSource, я даже не смогу успешно установить какие-либо подключения. Обычный javax.sql.DataSource представляется здесь правильным значением.
Второе примечание: я использую mysql-connector-java версии 5.1.35
2 ответа
Только что услышанный от Oracle, это, очевидно, известная ошибка, которая будет исправлена в следующем выпуске: 5.1.36
У меня та же проблема с Oracle MySQL Connector/J 5.1.39. Я могу выполнить аварийное переключение, запрашивая новое соединение с Fabric, только перехватывая исключение в моем коде:
...
} catch(java.sql.SQLException e) {
int errorCode = e.getErrorCode();
/*
* java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement
* java.sql.SQLException: Cannot execute statement in a READ ONLY transaction.
*
*/
if(errorCode == 1290 || errorCode == 1792) {
System.out.println("Failover");
System.out.println(e.toString());
connection.close();
rawConnection = DriverManager.getConnection(baseUrl, mysql_user, mysql_password);
connection = (FabricMySQLConnection) rawConnection;
}
Обращаясь в службу поддержки Oracle по поводу автоматического переключения при сбое со стороны соединителя, они отвечают: "Соединитель / J не имеет желаемой функции".
Есть кто-то, способный интегрировать этот перехват в пуле соединений?