2012-07-20 18 views
7

Estoy usando C3P0 y el controlador MS SQL JDBC 4 para conmutar por error automáticamente a una nueva réplica de la base de datos cuando la base de datos desaparece. Si primero se conecta a la base de datos principal, entonces la conmutación por error funciona y cambia sin problemas a la base de datos duplicada. Sin embargo, si el DB principal está inactivo cuando se inicia la aplicación, y el DB duplicado está disponible para conectarse (probado con MSSQL Studio), entonces la aplicación no se inicia y no puede conectarse al espejo de respaldo.MSSQL El controlador JDBC no se conectará a mirror failoverPartner en la primera conexión

Aquí está la URL de conexión:

jdbc:sqlserver://PRINCIPALDB;databaseName=app_space;port=99999;failoverPartner=MIRRORDB 

tengo c3p0.testConnectionOnCheckout y c3p0.preferredTestQuery conjunto, y c3p0.acquireRetryAttempts no se establece (utilizando por defecto de 30).

¿Por qué no se conecta al mirror DB inicialmente cuando el principal está inactivo? Necesitamos esto porque si la energía eléctrica se redujo o algo y DB principal está caído, y el servidor de la aplicación necesita ser reciclado, entonces la conmutación por error no ayudará.

Referencia:

http://www.mchange.com/projects/c3p0/#configuring_recovery

Using Database Mirroring (JDBC) (! MSDN utiliza paréntesis sin escapar en sus direcciones URL) http://msdn.microsoft.com/en-US/library/aa342332(v=sql.90)


Aquí hay algunos registros de la aplicación.

Y aquí hay un tipo diferente de error que a veces da, con una advertencia de interbloqueo.

<14>[APP]: INFO 20 Jul 2012 18:05:43,049 [main] net.sf.hibernate.connection.C3P0ConnectionProvider "C3P0 using driver: com.microsoft.sqlserver.jdbc.SQLServerDriver at URL: jdbc:sqlserver://PRINCIPALDB:9999;databaseName=APP_space;failoverPartner=MIRRORDB:9999" 
<14>[APP]: INFO 20 Jul 2012 18:05:43,049 [main] net.sf.hibernate.connection.C3P0ConnectionProvider "Connection properties: {user=USERNAME, password=PASSWORD}" 
<14>[APP]: INFO 20 Jul 2012 18:05:43,190 [main] com.mchange.v2.log.MLog "MLog clients using log4j logging." 
<14>[APP]: INFO 20 Jul 2012 18:05:43,518 [main] com.mchange.v2.c3p0.C3P0Registry "Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]" 
<14>[APP]: INFO 20 Jul 2012 18:05:43,612 [main] net.sf.hibernate.transaction.TransactionFactoryFactory "Transaction strategy: net.sf.hibernate.transaction.JDBCTransactionFactory" 
<14>[APP]: INFO 20 Jul 2012 18:05:43,612 [main] net.sf.hibernate.transaction.TransactionManagerLookupFactory "No TransactionManagerLookup configured (in JTA environment, use of process level read-write cache is not recommended)" 
<14>[APP]: INFO 20 Jul 2012 18:05:43,658 [main] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource "Initializing c3p0 pool... [email protected] [ connectionPoolDataSource -> [email protected] [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1bqq23w8o1a6dec41cwe1cd|20e1bfee, idleConnectionTestPeriod -> 100, initialPoolSize -> 10, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxI... 
<14>...dleTime -> 3600, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 150, maxStatements -> 1000, maxStatementsPerConnection -> 0, minPoolSize -> 10, nestedDataSource -> [email protected] [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1bqq23w8o1a6dec41cwe1cd|20360e46, jdbcUrl -> jdbc:sqlserver://PRINCIPALDB:9999;databaseName=APP_space;failoverPartner=MIRRORDB:9999, properties -> {user=******, password=******} ], preferredTestQuery -> select * from CLUSTERSAFETY, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1bqq23w8o1a6dec41cwe1cd|6f3e49a8, numHelperThreads -> 3 ]" 
<12>[APP]: WARN 20 Jul 2012 18:06:03,644 [Timer-0] com.mchange.v2.async.ThreadPoolAsynchronousRunner "com[email protected]37f844f7 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!" 
<12>[APP]: WARN 20 Jul 2012 18:06:03,644 [Timer-0] com.mchange.v2.async.ThreadPoolAsynchronousRunner "com[email protected]37f844f7 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3 
    Active Threads: 3 
    Active Tasks: 
     com.mchange.v2.resourcepool.BasicRes[email protected] (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
     [email protected]5b (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
     [email protected]cc (com.mchange.v2.asyn... 
<12>...c.ThreadPoolAsynchronousRunner$PoolThread-#2) 
    Pending Tasks: 

Me corrió un programa de prueba de la documentación con esta conexión:

jdbc:sqlserver://PRINCIPALDB:9999;databaseName=APP_space;portNumber=9999;failoverPartner=MIRRORDB:9999 

y lanzar esta excepción, como si estuviera tratando un puerto diferente que he especificado!

Connection to principal server failed, trying the mirror server. 
com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host MIRRORDB:9999, port 1433 has failed. Error: "null. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.". 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190) 

El punto importante es que intentó conectarse al puerto 1433 en lugar del puerto que especifiqué, de muchas maneras diferentes.

Respuesta

6

he encontrado la respuesta! ¡Debe especificar el nombre de la instancia como parte del nombre de host! Ejemplo:

jdbc:sqlserver://DEVSQLB\SQLB;databaseName=db_space;portNumber=99999;failoverPartner=BACKUPSQLA\SQLA 

donde \SQLA es el nombre de la instancia! No estoy exactamente seguro de qué es una instancia, pero la he visto referida muchas veces en SQL Server. Para descubrir esta información secreta, yo (mi empresa) tuve que solicitar asistencia directamente de Microsoft.

Ah, olvidaba:

  • Puede solucionar este problema utilizando el formato "servidor \ nombre_instancia" y asegúrese de que el servicio de navegador se está ejecutando y en el modo automático.
4

La documentación del controlador JDBC de SQL Server here tiene la siguiente (confuso) descargo de responsabilidad:

Nota El conductor no soporta especificar el número de puerto instancia de servidor para la instancia socio de conmutación por error como parte del FailoverPartner propiedad en la cadena de conexión. Sin embargo, se admiten las propiedades serverName, instanceName y portNumber de la instancia del servidor principal y la propiedad failoverPartner de la instancia del socio de conmutación por error en la misma cadena de conexión.

De esto sugeriría añadiendo: serverName = PRINCIPALDB; instanceName = MyInstance propiedades y ver si funciona.


Menciona que la conmutación por error está activa. Tenga en cuenta que para algunas configuraciones de servidor Sql Server, una conmutación por error no es automatic. Es posible que desee comprobar que puede conectarse a su MIRRORDB usando JDBC:

jdbc:sqlserver://MIRRORDB;databaseName=app_space;port=9999; 
+1

Ok lo intentaré. Sí, el espejo estaba activo, cuando me conecté a él y el DBA lo activó manualmente, y también lo configuré para que sea automático con un testigo. Intentaremos instanceName. Parece que solo se conecta en el puerto 1433 para failover, lo que lo haría bastante roto para alta disponibilidad. – Chloe

+0

Lamentablemente no puedo probar esto. El principal y el espejo usan nombres de instancia diferentes, \ SQLA y \ SQLB. En producción usan el mismo nombre de instancia, pero no puedo probar allí. – Chloe

+1

Oh sí, no puedes conectarte al espejo si está en modo espejo de todos modos. Después de que se conecte y se convierta en principal, puede conectarse, pero luego el antiguo principal queda 'fuera de línea' y no puede conectarse. – Chloe

Cuestiones relacionadas