2012-07-20 12 views
7

Używam sterownika C3P0 i sterownika MS SQL JDBC 4 do automatycznego przełączania awaryjnego do nowego dublowania bazy danych, gdy baza danych zniknie. Jeśli najpierw połączy się z główną bazą danych, to przełączenie awaryjne działa i przełącza się bezproblemowo do DB lustra. Jeśli jednak główna baza danych jest wyłączona podczas uruchamiania aplikacji, a baza lustrzana DB jest dostępna do połączenia (przetestowana z programem MSSQL Studio), aplikacja nie uruchamia się i nie może połączyć się z lustrem zapasowym.Sterownik JDBC MSSQL nie będzie łączył się z mirroroverPartner na pierwszym połączeniu

Oto URL gra:

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

mam c3p0.testConnectionOnCheckout i c3p0.preferredTestQuery zestaw i c3p0.acquireRetryAttempts NIE jest ustawiony (za pomocą domyślnej wartości 30).

Dlaczego nie łączy się z bazą danych lustrzanej początkowo, gdy element główny jest wyłączony? Potrzebujemy tego, ponieważ jeśli zasilanie spadnie lub coś i główny DB zostanie wyłączony, a serwer aplikacji wymaga recyklingu, wówczas przełączanie awaryjne nie pomoże.

referencyjny:

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

Using Database Mirroring (JDBC) (! MSDN wykorzystuje Niecytowany nawiasów w adresach URL) http://msdn.microsoft.com/en-US/library/aa342332(v=sql.90)


Oto niektóre dzienniki z aplikacji.

A tutaj jest inny rodzaj błędu, który czasami daje, z ostrzeżeniem o zakleszczeniu.

<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: 
     [email protected]59 (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: 

wpadłem program testowy z dokumentacją w związku z tym:

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

i wyrzucić ten wyjątek, jakby próbował innego portu niż określony!

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) 

Ważne jest to, że próbował połączyć się z portem 1433 zamiast podanego portu, na wiele różnych sposobów.

Odpowiedz

6

Znalazłem odpowiedź! Musisz podać nazwę instancji jako część nazwy hosta! Przykład:

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

gdzie \SQLA to nazwa instancji! Nie jestem do końca pewien, co to jest instancja, ale widziałem to wielokrotnie w SQL Server. Aby znaleźć te tajne informacje, ja (moja firma) musiałem poprosić o wsparcie bezpośrednio od firmy Microsoft.

Och, zapomniałem:

  • Można rozwiązać ten problem przy użyciu formatu „server \ instance_name” i upewnij się, że przeglądarka działa w trybie automatycznym.
4

Dokumentacja sterownika SQL Server JDBC here ma następujący (mylące) Zastrzeżenie:

Uwaga Kierowca nie obsługuje określania numeru portu instancji serwera na przykład partnera pracy awaryjnej jako część failoverPartner właściwość w ciągu połączenia. Jednak obsługiwane są właściwości serverName, nazwa_instancji i numer_portu głównej instancji serwera i właściwość failoverPartner instancji partnera pracy awaryjnej w tym samym ciągu połączenia.

Od tego Proponuję dodając: serverName = PRINCIPALDB; instanceName = MyInstance właściwości i sprawdzić, czy to działa.


Wspomina się, że tryb pracy awaryjnej jest aktywny. Zauważ, że dla niektórych konfiguracji serwerów lustrzanych Sql przełączanie awaryjne nie jest automatic. Możesz sprawdzić, czy można połączyć się z MIRRORDB użyciu JDBC:

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

OK spróbuję. Tak, lustro było aktywne, ponieważ podłączyłem się do niego i DBA ręcznie uczynił je aktywnym, a także ustawiłem je jako automatyczne na świadka. Spróbuję instanceName. Wydaje się, że łączy się tylko na porcie 1433 w celu przełączenia awaryjnego, co spowodowałoby, że zostałby złamany z powodu wysokiej dostępności. – Chloe

+0

Niestety nie mogę tego przetestować. Główny i mirror używają różnych nazw instancji, \ SQLA i \ SQLB. W produkcji używają tej samej nazwy instancji, ale nie mogę tam przetestować. – Chloe

+1

O tak, nie można połączyć się z lustrem, jeśli jest w trybie lustra. Po przejściu do trybu online i stanie się głównym, możesz połączyć się, ale stary kontroler przejdzie w tryb "offline" i nie będzie mógł się połączyć. – Chloe

Powiązane problemy