12

我正在主/从架构中的 MySQL 上设置故障转移集群。我还在配置我的 JBoss 数据源,并且我正在寻找更好的方法来测试我的连接,因为我知道它适用于 Alfresco(使用 Ibatis)。

即使我多次练习 MySQL,我也不太了解 MySQL Server 中的内部执行机制。

到目前为止,我正在使用此查询来测试我的 SQL 连接(如在此线程中:Jboss 数据源中的数据库故障转移)

SELECT 1;

这里是完整的数据源。

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
    <jndi-name>alfresco-datasource</jndi-name>
    <connection-url>
        jdbc:mysql://10.1.2.13,10.1.2.14:3306/alfresco
    </connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>alfresco</user-name>
    <password>alfresco</password>
    <exception-sorter-class-name>
        org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
    </exception-sorter-class-name>


    <connection-property name="readOnly">false</connection-property>
    <failOverReadOnly>false</failOverReadOnly>

    <!-- Automatic reconnecion - desactivated to preserve transactions  -->
    <!-- http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html :
    Failover happens when the driver determines that the connection has failed (checked before every query), and falls back to the first host when it determines that the host has become available again (after queriesBeforeRetryMaster queries have been issued). -->
    <!--<autoReconnect>true</autoReconnect>-->

    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
    <valid-connection-checker-class-name>
        org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker
    </valid-connection-checker-class-name>


    <!-- If you're using Connector/J 3.1.8 or newer, you can use our implementation 
        of these to increase the robustness "mysql-ds.xml" 64L, 3683C of the connection 
        pool. -->
    <exception-sorter-class-name>
        com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter
    </exception-sorter-class-name>
    <valid-connection-checker-class-name>
        com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker
    </valid-connection-checker-class-name>

    <metadata>
        <type-mapping>mySQL</type-mapping>
    </metadata>
</local-tx-datasource>

</datasources>

我有多个我无法自己回答的问题:

  • Ibatis(或任何类型或 ORM)不会缓存这个简单的查询吗?这意味着它可能会返回错误的结果。
  • 这个查询会不会太简单了?它真的试图执行代表服务器健康的内部机制吗?还是只测试连接?
  • 这真的是一个可靠的测试吗?
  • 是否有任何其他类型的测试(例如已经与 Connector/J 集成)?
  • 性能对我来说也很重要,所以 SELECT 1 是健康检查和性能之间的一个很好的折衷方案

不要犹豫,指出一些链接(无论是否在 Stackoverflow 内)。如果这个问题已经回答了(据我搜索似乎没有),我显然会删除这个线程。

我非常感谢 mysql 开发人员或管理员的经验回报。我正在寻找最好的方法来做到这一点。

谢谢你的帮助。

4

2 回答 2

19

引用此链接:Ping MySQL Server Using JDBC

你必须:

MySQL JDBC 驱动程序 (Connector/J) 提供了 ping 机制。

如果您执行带有 /* ping */ 前缀的 SQL 查询,例如:

"/* ping */ SELECT 1" 这实际上会导致驱动程序向服务器发送 ping 并返回一个虚假的、轻量级的结果集。

(您可以在 Connector/J 文档中找到这个隐藏相当深的内容;在该页面上搜索“ping”。仔细阅读:这种机制对使用的语法非常敏感。与大多数 SQL 不同,“ping”的“解析” " 标记发生在客户端 JDBC 驱动程序本身中。)。

于 2012-06-11T19:36:20.207 回答
2

我们在工作中用来检查与 MySQL 服务器的连接的查询非常SHOW databases;简单,因为它不需要您选择特定的数据库。我会说它非常可靠,并且这样的查询非常有效。

于 2012-06-11T19:30:35.530 回答