sql-server - descargar - jdbc sql server 4
El controlador MSSQL JDBC no se conectará a mirror failoverpartner en la primera conexión (2)
La documentación del controlador Sql Server JDBC aquí tiene el siguiente (confuso) descargo de responsabilidad:
Nota El controlador no admite la especificación del número de puerto de la instancia del servidor para la instancia del socio de conmutación por error como parte de la propiedad failoverPartner 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.
A partir de esto, sugeriría agregar: serverName = PRINCIPALDB; instanceName = MyInstance y ver si eso 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 automática . Es posible que desee verificar que se puede conectar a su MIRRORDB usando jdbc:
jdbc:sqlserver://MIRRORDB;databaseName=app_space;port=9999;
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.
Aquí está la URL de conexión:
jdbc:sqlserver://PRINCIPALDB;databaseName=app_space;port=99999;failoverPartner=MIRRORDB
Tengo c3p0.testConnectionOnCheckout
y c3p0.preferredTestQuery
establecido, y c3p0.acquireRetryAttempts
NO está configurado (usando el valor predeterminado de 30).
¿Por qué no se conecta al mirror DB inicialmente cuando el principal está caído? Necesitamos esto porque si la energía 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
Uso de la creación de reflejo de la base de datos (JDBC) (¡MSDN utiliza paréntesis no guarnecidos en sus URL!) Http://msdn.microsoft.com/en-US/library/aa342332(v=sql.90)
Aquí hay algunos registros de la aplicación.
<14>[APP]: INFO 20 Jul 2012 12:21:21,982 [main] net.sf.hibernate.connection.C3P0ConnectionProvider "C3P0 using driver: com.microsoft.sqlserver.jdbc.SQLServerDriver at URL: jdbc:sqlserver://PRINCIPAL;databaseName=APP_space;port=9999;failoverPartner=MIRRORDB"
<14>[APP]: INFO 20 Jul 2012 12:21:21,982 [main] net.sf.hibernate.connection.C3P0ConnectionProvider "Connection properties: {user=USERNAME, password=PASSWORD}"
<14>[APP]: INFO 20 Jul 2012 12:21:22,435 [main] net.sf.hibernate.transaction.TransactionFactoryFactory "Transaction strategy: net.sf.hibernate.transaction.JDBCTransactionFactory"
<14>[APP]: INFO 20 Jul 2012 12:21:22,450 [main] net.sf.hibernate.transaction.TransactionManagerLookupFactory "No TransactionManagerLookup configured (in JTA environment, use of process level read-write cache is not recommended)"
<12>[APP]: WARN 20 Jul 2012 12:29:17,279 [main] net.sf.hibernate.cfg.SettingsFactory "Could not obtain connection metadata"
<12>java.sql.SQLException: Connections could not be acquired from the underlying database!
<12> at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
<12> at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529)
<12> at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
<12> at net.sf.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:33)
<12> at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
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... com.mchange.v2.c3p0.PoolBackedDataSource@616301db [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@d6ed198b [ 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 -> com.mchange.v2.c3p0.DriverManagerDataSource@2c0fb781 [ 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.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@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.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@37f844f7 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@52783859 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@52bb855b (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@153043cc (com.mchange.v2.asyn...
<12>...c.ThreadPoolAsynchronousRunner$PoolThread-#2)
Pending Tasks:
Ejecuté 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 arrojó esta excepción, como si estuviera probando un puerto diferente al 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.
¡Encontré 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, se olvidó:
- Puede solucionar este problema utilizando el formato "server / instance_name" y asegúrese de que el servicio del navegador se esté ejecutando y en modo automático.