2012-07-20 28 views
7

C3P0とMS SQL JDBC 4ドライバを使用して、データベースがなくなると自動的に新しいデータベースミラーにフェールオーバーします。最初にプリンシパルDBに接続すると、フェールオーバーが機能し、ミラーDBにシームレスに切り替わります。ただし、アプリケーションの起動時にプリンシパルDBがダウンしていて、ミラーDBが接続可能(MSSQL Studioでテスト済み)の場合、アプリケーションは起動に失敗し、バックアップミラーに接続できません。ここでMSSQL JDBCドライバは、最初の接続時にミラーfailoverPartnerに接続しません。

は、接続URLです:

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

は私がc3p0.testConnectionOnCheckoutc3p0.preferredTestQueryセットを持っている、とc3p0.acquireRetryAttemptsは(30のデフォルトを使用)に設定されていません。

プリンシパルがダウンしているときに、最初にミラーDBに接続しないのはなぜですか?電源が落ちたり、プリンシパルDBがダウンしたり、アプリケーションサーバーのリサイクルが必要になったりすると、フェールオーバーが役に立たないため、これが必要です。

参考:ここで

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

Using Database Mirroring (JDBC)(!MSDNがそのURLにエスケープされていない括弧を使用しています) http://msdn.microsoft.com/en-US/library/aa342332(v=sql.90)


はアプリからいくつかのログです。

ここでは、さまざまなタイプのエラーがあり、デッドロックの警告が表示されます。

<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]7f844f7 -- 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: 

私はこの接続にドキュメントからテストプログラムを実行しました:

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

、それは私が指定した以外のポートをしようとしていたようにそれは、この例外を投げます!

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) 

重要な点は、私が指定したポートの代わりにポート1433に接続しようとしたことです。

答えて

6

私は答えを見つけました!ホスト名の一部としてインスタンス名を指定する必要があります。例:

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

\SQLAはインスタンス名です。インスタンスが何であるか正確にはわかりませんが、SQL Serverでは何度も参照されています。この秘密の情報を見つけるために、私(私の会社)はマイクロソフトから直接サポートを要求しなければなりませんでした。

ああ、忘れてしまった:

  • あなたは を「サーバー\ INSTANCE_NAME」の形式を使用してこの問題を解決し、ブラウザサービスが実行されていることを確認し、自動モードで行うことができます。
4

SQL ServerのJDBCドライバのドキュメントhereは、以下の(混乱)免責事項があります。

注意を failoverPartnerの一環として、フェールオーバーパートナーインスタンスのサーバーインスタンスのポート番号を指定してサポートしていないドライバ接続文字列のプロパティ。ただし、同じ接続文字列内のフェールオーバーパートナーインスタンスのプリンシパルサーバーインスタンスとfailoverPartnerプロパティのserverName、instanceNameおよびportNumberプロパティを指定することはサポートされています。私は追加を示唆している。このことから

サーバ名= PRINCIPALDB; instanceNameの= MYINSTANCE 性質とそれが動作するかどうかを確認。


フェールオーバーがアクティブであると言います。一部のSQL Serverミラー構成では、フェールオーバーはautomaticではありません。あなたは、JDBCを使用してMIRRORDBに接続できることを確認することもできます。

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

はい、ミラーに接続していて、DBAが手動でアクティブにしていて、ミラーリングを有効にしています。 instanceNameを試します。フェイルオーバーのためにポート1433に接続するように見えるため、高可用性のためにかなり壊れてしまいます。 – Chloe

+0

残念ながら私はこれをテストすることはできません。プリンシパルとミラーは、異なるインスタンス名\ SQLAと\ SQLBを使用します。プロダクションでは、同じインスタンス名を使用しますが、そこではテストできません。 – Chloe

+1

ああ、ミラーモードになっているとミラーに接続できません。オンラインになってプリンシパルになった後、接続できますが、古いプリンシパルは「オフライン」になり、接続できません。 – Chloe