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