2012-06-11 14 views
9

Estoy configurando un clúster de conmutación por error en MySQL, en una arquitectura maestro/esclavo. También estoy configurando mi JBoss Datasource, y estoy buscando la mejor manera de probar mi conexión, sabiendo que es para Alfresco (que está usando Ibatis).Prueba de validez de conexión MySQL en el origen de datos: ¿SELECCIONAR 1 o algo mejor?

Incluso en las prácticas de MySQL muchas veces, no conozco muy bien los mecanismos internos de ejecución en MySQL Server.

Hasta el momento, estoy usando esta consulta para probar mi conexión SQL (como en este hilo: Database Fail Over in Jboss Data sources)

SELECT 1; 

Aquí la fuente de datos completa.

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

que tienen múltiples pregunta que no soy capaz de responder por mí mismo:

  • ¿No será esta consulta sencilla tener una caché mediante Ibatis (o cualquier tipo o ORM)? Esto significaría que podría devolverme resultados falsos.
  • ¿No sería demasiado simple esa consulta? ¿Realmente está tratando de ejecutar mecanismos internos que serían representativos de la salud del servidor? ¿O probará solo la conexión?
  • ¿Es realmente una prueba confiable?
  • ¿Hay algún otro tipo de prueba (ya integrada con Connector/J, por ejemplo)?
  • rendimiento también es importante para mí, así es seleccionar la ruta 1 es un buen compromiso entre la facturación salud y el rendimiento

No dude en señalar algunos enlaces (dentro Stackoverflow o no). Si esta pregunta ya se ha respondido (parece que no, por lo que busqué), obviamente borraré este hilo.

Agradecería mucho las devoluciones de los desarrolladores o administradores de mysql. Estoy buscando la mejor manera de hacerlo.

Gracias por su ayuda.

Respuesta

15

Citando este enlace: Ping MySQL Server Using JDBC

usted tiene que:

El controlador JDBC de MySQL (Connector/J) proporciona un mecanismo de ping.

Si usted hace una consulta SQL antepuesto con/* de ping * /, tales como:

"/ * de ping */SELECT 1" En realidad, esto hará que el controlador envía un ping al servidor y devuelve un falso , liviano, conjunto de resultados.

(Puede encontrar esto enterrado bastante profundo en la documentación de Connector/J , busque "ping" en esa página.Léalo detenidamente: este mecanismo es muy sensible a la sintaxis utilizada. A diferencia de la mayoría de SQL, el "análisis" del marcador "ping" que ocurre en el controlador JDBC de cliente sí mismo.).

+1

¡Genial! ¡Es exactamente el tipo de consejos que estaba buscando! –

+0

eres hombre de bienvenida, espero que va a encajar con su configuración JDBC. – Sebas

+0

Voy a tratar lo antes posible. Il cayó, esta será LA respuesta;). Muchas gracias. –

2

La consulta que usamos en el trabajo para verificar la conexión a un servidor MySQL es SHOW databases;, lo que es agradable y simple ya que no necesita que haya seleccionado una base de datos en particular. Yo diría que es bastante confiable y una consulta como esa es bastante eficiente.

+0

De hecho, al igual que en Oracle, cuando se utiliza comandos como SELECT 1 FROM DUAL 1 para contestar. Eso parece confiable y eficiente, pero investigaría más sobre el truco del ping. –

+2

No estoy seguro de por qué cualquier consulta de selección sería almacenada en caché por un ORM. Si tiene miedo de eso, debería usar 'SELECT SQL_NO_CACHE 1;'. No creo que 'SHOW DATABASES;' sea mejor que 'select 1;'. – Sebas

+0

@Sebas Punto justo. Eliminé la información dudosa. – deadly

Cuestiones relacionadas