2012-07-20 16 views
7

C3P0 ve MS SQL JDBC 4 sürücüsünü kullanarak veritabanım kaybolduğunda otomatik olarak yeni bir veritabanı yansımasına geçiyorum. İlk önce ana DB'ye bağlanırsa, yük devretme çalışır ve ayna DB'ye sorunsuzca geçer. Ancak, uygulama başladığında asıl DB aşağı ve yansıtma DB (MSSQL Studio ile test edilen) bağlanmak için kullanılabilirse, uygulama başlatılamaz ve yedekleme yansıtma bağlanmak için başarısız olur. Ben c3p0.testConnectionOnCheckout ve c3p0.preferredTestQuery setine sahipMSSQL JDBC sürücüsü yansıtma başarısızlığına bağlanmaz İlk bağda yer alanPartner

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

ve c3p0.acquireRetryAttempts (30 varsayılan kullanarak) ayarlı DEĞİL: İşte

bağlantı URL'dir.

Niçin devre dışı kaldığında, başlangıçta DB'ye bağlanmıyor? Buna ihtiyacımız var çünkü güç kesildiyse veya bir şey ve temel DB kapalıysa ve uygulama sunucusunun geri dönüşüme ihtiyacı varsa, yük devretme yardım etmeyecektir.

Referans:

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

Using Database Mirroring (JDBC) (! MSDN URL'lerinde çıkış kullanılmamış parantez kullanır) İşte http://msdn.microsoft.com/en-US/library/aa342332(v=sql.90)


uygulamasından bazı kayıtları.

Ve bazen bir kilitlenme uyarısıyla birlikte verdiği farklı bir hata türüdür.

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

ve ben belirtilenden farklı bir port çalışıyordu gibi, bu istisna:

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

Ben bu bağlantıyla belgelerinden bir test programı koştu!

Belirttiğim bağlantı noktası yerine bağlantı noktası 1433'e bağlanmaya çalıştığı için önemli bir nokta, birçok farklı yol.

cevap

6

Yanıt bulundu! Örnek adını, ana makine adının bir parçası olarak belirtmelisiniz! Örnek:

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

\SQLA örnek adıdır! Bir örneğin tam olarak ne olduğundan emin değilim, ancak SQL Server'da birçok kez başvurduğunu gördüm. Bu gizli bilgiyi bulmak için, (şirketim) doğrudan Microsoft'tan destek istemesi gerekiyordu.

Ah, unuttum:

  • Sen "sunucu \ instance_name" biçimini kullanarak bu sorunu gidermek ve tarayıcı servisi çalıştığından emin ve otomatik modda yapabilirsiniz.
4

SQL Server JDBC sürücüsü belgeleri here aşağıdaki (kafa karıştırıcı) yasal uyarı vardır:

Not failoverPartner bir parçası olarak çalışma ortağı örneği için sunucu örneği bağlantı noktası numarasını belirterek desteklemiyor sürücü bağlantı dizesindeki özellik. Ancak, ana sunucu örneğinin serverName, instanceName ve portNumber özelliklerinin ve aynı bağlantı dizesindeki failover iş ortağı örneğinin failoverPartner özelliğinin belirtilmesi desteklenir. Ben ekleyerek öneririz Bundan

: serverName = PRINCIPALDB; örnekAdı = MyInstance özellikleri ve bu çalışıp çalışmadığına bakın.


Yük devretme etkin olduğunu belirtin. Bazı Sql Server yansıtma yapılandırmaları için bir yük devretmenin automatic olmadığını unutmayın. Eğer jdbc kullanarak MIRRORDB bağlanabileceğini doğrulamak isteyebilirsiniz:

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

Tamam deneyecek. Evet, ayna aktif oldu, ona bağlı olduğumdan ve DBA bunu aktif hale getirdi ve bir tanıkla otomatik olarak ayarlandı. ÖrnekAdı deneyecek. Yük devretme için yalnızca 1433 numaralı bağlantı noktasına bağlanılıyor gibi görünüyor, bu da yüksek kullanılabilirlik için oldukça bozuk olmasını sağlar. – Chloe

+0

Maalesef bunu test edemiyorum. Ana ve ayna farklı örnek isimleri, \ SQLA ve \ SQLB kullanır. Üretimde aynı örnek adını kullanıyorlar, ancak ben orada test edemiyorum. – Chloe

+1

Oh evet, yine de ayna modundaysa aynaya bağlanamazsınız. Çevrimiçi hale geldikten ve müdür olduktan sonra bağlanabiliyorsunuz, ancak eski müdür "çevrimdışı" oluyor ve bağlanamıyorsunuz. – Chloe

İlgili konular