2012-07-20 12 views
7

मैं C3P0 और एमएस एसक्यूएल JDBC 4 ड्राइवर का उपयोग कर रहा स्वचालित रूप से एक नया डेटाबेस दर्पण के लिए विफलता के लिए जब डेटाबेस चली जाती है कनेक्ट failoverPartner दर्पण से कनेक्ट नहीं होगा। यदि यह पहली बार प्रिंसिपल डीबी से जुड़ता है, तो फेलओवर काम करता है और यह दर्पण डीबी के लिए सहजता से स्विच करता है। हालांकि, अगर प्रिंसिपल डीबी नीचे है जब आवेदन शुरू होता है, और दर्पण डीबी कनेक्ट करने के लिए (MSSQL स्टूडियो के साथ परीक्षण) उपलब्ध है, तो आवेदन शुरू करने के लिए विफल रहता है और बैकअप दर्पण से कनेक्ट करने में विफल रहता है। मैं c3p0.testConnectionOnCheckout और c3p0.preferredTestQuery सेट हैMSSQL JDBC ड्राइवर पर पहले

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

, और c3p0.acquireRetryAttempts सेट नहीं है (30 के डिफ़ॉल्ट का उपयोग कर):

यहां कनेक्शन यूआरएल है।

क्यों इसे शुरू में डीबी दर्पण से कनेक्ट नहीं होगा जब प्रिंसिपल नीचे है? हमें इसकी आवश्यकता है क्योंकि अगर बिजली गिर गई है या कुछ और प्रिंसिपल डीबी नीचे है, और ऐप सर्वर को रीसाइक्लिंग की जरूरत है, तो फेलओवर मदद नहीं करेगा।

संदर्भ:

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)


यहाँ app से कुछ लॉग नहीं है।

और यहां एक अलग प्रकार की त्रुटि है जिसे कभी-कभी डेडलॉक चेतावनी के साथ देता है।

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

मैं इस कनेक्शन के साथ दस्तावेज़ से एक परीक्षण कार्यक्रम भागा:

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 सर्वर में कई बार संदर्भित किया है। इस गुप्त जानकारी को खोजने के लिए, मुझे (मेरी कंपनी) को सीधे माइक्रोसॉफ्ट से समर्थन का अनुरोध करना पड़ा।

ओह, भूल गया:

  • आप प्रारूप "सर्वर \ instance_name" का उपयोग करके इस समस्या को हल करने और यह सुनिश्चित करें कि ब्राउज़र सेवा चल रही है और स्वत: मोड में कर सकते हैं।
4

Sql सर्वर JDBC ड्राइवर प्रलेखन here निम्नलिखित (भ्रमित) त्याग दिया गया है:

नोट ड्राइवर failoverPartner के हिस्से के रूप विफलता साथी उदाहरण के लिए सर्वर उदाहरण पोर्ट संख्या को निर्दिष्ट करने का समर्थन नहीं करता कनेक्शन स्ट्रिंग में संपत्ति। हालांकि, सर्वर कनेक्शन, exampleName और portNumber गुणों को निर्दिष्ट करता है प्रिंसिपल सर्वर इंस्टेंस और फेलओवर समान कनेक्शन स्ट्रिंग में फ़ेलओवर पार्टनर इंस्टेंस की पार्टनर प्रॉपर्टी समर्थित है।

इस मैं जोड़ने का सुझाव से: Servername = PRINCIPALDB; InstanceName = MyInstance गुण और देखते हैं कि अगर काम करता है।


आप उल्लेख करते हैं कि विफलता सक्रिय है। ध्यान दें कि कुछ SQL सर्वर दर्पण कॉन्फ़िगरेशन के लिए एक विफलता automatic नहीं है। आप सत्यापित करें कि आप JDBC का उपयोग कर अपने MIRRORDB से जुड़ सकते हैं चाहते हो सकता है:

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

ठीक है कोशिश करें। हां, दर्पण सक्रिय था, क्योंकि मैंने उससे कनेक्ट किया था और डीबीए ने इसे सक्रिय बना दिया था, और इसे गवाह के साथ स्वचालित भी सेट किया था। ExampleName कोशिश करेंगे। ऐसा लगता है कि फेलओवर के लिए केवल पोर्ट 1433 पर कनेक्ट है, जो इसे उच्च उपलब्धता के लिए काफी हद तक टूटा कर देगा। – Chloe

+0

दुर्भाग्य से मैं इसका परीक्षण नहीं कर सकता। प्रिंसिपल और दर्पण विभिन्न इंस्टेंस नाम, \ SQLA और \ SQLB का उपयोग करते हैं। उत्पादन में वे एक ही इंस्टेंस नाम का उपयोग करते हैं, लेकिन मैं वहां परीक्षण नहीं कर सकता। – Chloe

+1

ओह हाँ, अगर आप मिरर मोड में हैं तो आप दर्पण से कनेक्ट नहीं हो सकते हैं। ऑनलाइन आने के बाद और प्रिंसिपल बनने के बाद, आप कनेक्ट कर सकते हैं, लेकिन फिर पुराना प्रिंसिपल 'ऑफलाइन' जाता है और आप कनेक्ट नहीं कर सकते हैं। – Chloe

संबंधित मुद्दे