2012-06-11 11 views
9

Ich richte einen Failover-Cluster auf MySQL in einer Master/Slave-Architektur ein. Ich konfiguriere auch meine JBoss Datenquelle, und ich bin auf der Suche nach dem besseren Weg, um meine Verbindung zu testen, in dem Wissen, dass es für Alfresco (die Ibatis verwendet) ist.MySQL-Verbindung Gültigkeitsprüfung in Datenquelle: SELECT 1 oder etwas besser?

Sogar ich praktizierte MySQL viele Male, ich weiß nicht sehr gut Interna Mechanismen der Ausführung in MySQL Server.

Bisher verwende ich diese Abfrage meine SQL-Verbindung zu testen (wie in diesem Thread: Database Fail Over in Jboss Data sources)

SELECT 1; 

Hier ist die volle Datenquelle.

<?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> 

Ich habe mehrere Fragen, die ich von mir selbst nicht in der Lage bin zu beantworten:

  • Wird nicht diese einfache Abfrage durch Ibatis zwischengespeichert werden (oder jede Art oder ORM)? Dies würde bedeuten, dass es mir falsche Ergebnisse zurückgeben könnte.
  • Wird diese Abfrage nicht zu einfach sein? Versucht sie wirklich, interne Mechanismen auszuführen, die für die Servergesundheit repräsentativ sind? Oder wird es nur die Verbindung testen?
  • Ist es wirklich ein zuverlässiger Test?
  • Gibt es eine andere Art von Test (z. B. bereits in Connector/J integriert)?
  • Leistung ist für mich auch wichtig, so ist SELECT 1 zwischen Gesundheitscheck und Leistung

Zögern Sie nicht zeigen mir einige Links (innen Stackoverflow oder nicht) ist ein guter Kompromiss. Wenn diese Frage schon beantwortet wurde (es scheint nicht, soweit ich gesucht habe), werde ich diesen Thread natürlich löschen.

Ich wäre sehr dankbar für die Rückkehr der Erfahrung von MySQL Entwickler oder Administratoren. Ich suche nach dem besten Weg, es zu tun.

Danke für Ihre Hilfe.

Antwort

15

Zitiert diesen Link: Ping MySQL Server Using JDBC

müssen Sie:

Der MySQL JDBC-Treiber (Connector/J) einen Ping-Mechanismus.

Wenn Sie eine SQL-Abfrage mit/* Ping vorangestellt */wie:

"/ * Ping */SELECT 1" Dies wird der Fahrer tatsächlich dazu führen, einen Ping an den Server senden und eine gefälschte Rück , geringes Gewicht, Ergebnismenge.

(Sie finden diese in der Connector/J Dokumentation ziemlich tief vergraben, suchen Sie auf dieser Seite nach "Ping".Lesen Sie es sorgfältig: Dieser Mechanismus ist sehr empfindlich gegenüber der verwendeten Syntax. Im Gegensatz zu den meisten SQL-Versionen passiert die "Analyse" des "ping" -Markers im clientseitigen JDBC-Treiber selbst.).

+1

Großartig! Es ist genau die Art von Tipps, nach denen ich gesucht habe! –

+0

du bist willkommen mann, ich hoffe, es wird mit Ihrer jdbc config passen. – Sebas

+0

Ich werde es so schnell wie möglich versuchen. Il fiel das wird die Antwort sein;). Danke vielmals. –

2

Die Abfrage, die wir bei der Arbeit verwenden, um die Verbindung zu einem MySQL-Server zu überprüfen, ist SHOW databases;, was nett und einfach ist, da Sie keine bestimmte Datenbank auswählen müssen. Ich würde sagen, es ist ziemlich zuverlässig und eine solche Abfrage ist ziemlich effizient.

+0

In der Tat, wie in Oracle, wenn Sie Befehle wie SELECT 1 FROM DUAL +1 für Sie beantworten. Das scheint zuverlässig und effizient, aber ich würde mehr über den Ping-Trick nachforschen. –

+2

Ich bin eigentlich nicht sicher, warum eine ausgewählte Abfrage von einem ORM zwischengespeichert würde. Wenn Sie Angst davor haben, sollten Sie einfach 'SELECT SQL_NO_CACHE 1;' verwenden. Ich denke nicht, SHOW DATABASES; 'ist besser als' select 1; '. – Sebas

+0

@Sebas Messepunkt. Ich habe die zweifelhaften Informationen entfernt. – deadly

Verwandte Themen