2012-06-11 9 views
9

Konfiguruję klaster pracy awaryjnej w MySQL, w architekturze master/slave. Konfiguruję także moje źródło danych JBoss i szukam lepszego sposobu przetestowania połączenia, wiedząc, że jest on przeznaczony dla Alfresco (który używa Ibatis).Test ważności połączenia MySQL w źródle danych: WYBIERZ 1 lub coś lepszego?

Nawet ja wielokrotnie zafascynowałem MySQL, nie znam dobrze wewnętrznych mechanizmów wykonywania w MySQL Server.

Dotychczas Używam tę kwerendę, aby przetestować swoje połączenie SQL (jak w tym wątku: Database Fail Over in Jboss Data sources)

SELECT 1; 

tu pełne źródła danych.

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

Mam kilka pytanie, że nie jestem w stanie odpowiedzieć za siebie:

  • Nie będzie to proste zapytanie być buforowane przez iBatis (lub dowolnego rodzaju lub ORM)? Oznaczałoby to, że mógłbym zwrócić mi fałszywe wyniki.
  • Czy to zapytanie nie będzie zbyt proste? Czy naprawdę próbuje wykonać wewnętrzne mechanizmy, które byłyby reprezentatywne dla zdrowia serwera? A może przetestuje tylko połączenie?
  • Czy to naprawdę niezawodny test?
  • Czy istnieje inny rodzaj testu (na przykład zintegrowany z Connector/J)?
  • Wydajność jest również ważne dla mnie, więc to wybrać 1 jest dobrym kompromisem pomiędzy WPR i wydajności

nie wahaj się wskazać mi kilka linków (wewnątrz Stackoverflow lub nie). Jeśli na to pytanie odpowiedziano już na pytanie (wydaje się, że nie tak daleko, jak szukałem), oczywiście usunę ten wątek.

Bardzo doceniam zwroty exeperience dla programistów lub administratorów mysql. Szukam najlepszego sposobu na zrobienie tego.

Dzięki za pomoc.

Odpowiedz

15

Cytując ten link: Ping MySQL Server Using JDBC

trzeba:

Sterownik JDBC MySQL (Connector/J) zapewnia mechanizm ping.

Jeśli do zapytania SQL poprzedzając ją/* ping * /, takie jak:

"/ * ping */select 1" Będzie to rzeczywiście spowodować kierowca wysłać ping do serwera i wrócić fałszywy , lekki, zestaw wyników.

(Możesz to znaleźć dość głęboko w dokumentacji Connector/J , szukaj "ping" na tej stronie.Przeczytaj go uważnie: to mechanizm jest bardzo wrażliwy na składni. W przeciwieństwie do większości SQL, "parsowanie" znacznika "ping" w dzieje się w samym sterowniku JDBC po stronie klienta, ).

+1

Świetnie! To właśnie tego rodzaju wskazówki, których szukałem! –

+0

jesteś człowiekiem, mam nadzieję, że pasuje do twojej konfiguracji jdbc. – Sebas

+0

będę go wypróbować ASAP. I spadł, to będzie odpowiedź;). Wielkie dzięki. –

2

Zapytanie, którego używamy w pracy do sprawdzenia połączenia z serwerem MySQL, to SHOW databases;, co jest miłe i proste, ponieważ nie wymaga wybrania konkretnej bazy danych. Powiedziałbym, że jest całkiem niezawodny i takie zapytanie jest dość wydajne.

+0

Rzeczywiście, jak w Oracle, kiedy użyć poleceń takich jak SELECT 1 FROM DUAL +1 Ci odpowiedzieć. Wydaje się to niezawodne i wydajne, ale chciałbym zbadać więcej na temat sztuczki pingowej. –

+2

jestem właściwie nie wiem, dlaczego każdy kwerenda wybierająca będzie buforowane przez ORM. Jeśli boisz się, że należy po prostu użyć 'SELECT SQL_NO_CACHE 1;'. Nie sądzę, że 'POKAŻ BAZY DANYCH;' jest lepsze niż 'wybierz 1;'. – Sebas

+0

@Sebas Fair punkt. Usunąłem wątpliwe informacje. – deadly

Powiązane problemy