使用Hibernate进行MySQL Fabric故障转移和连接池

时间:2015-06-04 17:18:33

标签: mysql hibernate jdbc connection-pooling mysql-fabric

我正在尝试使用JNDI资源,Hibernate和连接池通过MySQL Fabric Server组实现自动故障转移。我们的数据库服务器场是使用MySQL Fabric正确设置的,我正在尝试实现客户端/连接器。

我的server.xml文件中声明了一个JNDI资源,它有一个基于MySQL Fabric的URL和驱动程序,并使用与hibernate的连接池。

<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不能很好地协同工作。取下主DB后,Fabric会按预期自动提升从站。但是,当我尝试与数据库建立新的连接时,我现在已经变老 - 现在已经不存在了,最明显的是当我请求读写时,我正在获得一个只读连接。作为附加信息,如果我重新启动我的Tomcat服务器并要求新连接,我会得到正确的结果。由于连接池,我特意发生的问题。

我需要知道的是,如果有一个我缺少的键/值对会使我的FabricDriver足够智能,以便在发生自动故障转移时知道擦除连接池。

我发现最好的是使用testOnBorrow,遗憾的是它只能使用SELECT查询(通过validationQuery),尽管询问,但当我获得只读连接时仍然会成功用于读写。

以前有人解决了这个问题吗?

注意:如果我尝试使用com.mysql.fabric.jdbc.FabricMySQLDataSource,我甚至无法成功建立任何连接。常规的javax.sql.DataSource似乎是正确的值。

第二个注意:我正在使用mysql-connector-java版本5.1.35

2 个答案:

答案 0 :(得分:1)

刚刚从Oracle那里听到,这显然是一个已知的错误,将在即将发布的版本中修复:5.1.36

答案 1 :(得分:0)

我对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提供关于连接器端自动故障转移的支持,他们回答&#34; Connector / J没有所需的功能&#34;。

有人能够将其整合到连接池中吗?