Отказоустойчивость 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 не имеет желаемой функции".

Есть кто-то, способный интегрировать этот перехват в пуле соединений?

Другие вопросы по тегам