【问题标题】:MySQL Fabric failover and Connection Pooling with HibernateMySQL Fabric 故障转移和连接池与 Hibernate
【发布时间】:2015-08-19 10:35:25
【问题描述】:

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

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

<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 会自动提升一个从属数据库。但是,当我尝试与数据库建立新连接时,我得到了旧的现已失效的连接,最值得注意的是,当我请求读写时,我得到了一个只读连接。作为附加信息,如果我重新启动我的 Tomcat 服务器并要求重新连接,我会得到正确的结果。我遇到的具体问题是由于连接池造成的。

我需要知道的是,我是否缺少一个键/值对,这将使我的 FabricDriver 足够聪明,知道在发生自动故障转移时擦除连接池。

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

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

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

第二个注意事项:我使用的是mysql-connector-java 5.1.35版

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我对 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 没有所需的功能”。

      有没有人能够将这个捕获集成到连接池中?

      【讨论】:

        猜你喜欢
        • 2012-03-19
        • 1970-01-01
        • 2018-10-20
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        相关资源
        最近更新 更多