2011-04-22 16 views
10

कल एडब्ल्यूएस के आरडीएस नीचे चला गया - और हमारे डेटाबेस भी किया।c3p0 के लिए getConnection() टाइमआउट कैसे सेट करें?

जब ऐसा हुआ, तो C3P0 डेटाबेस कनेक्शन प्राप्त करने का प्रयास करेगा और लटका होगा। मैं स्पष्ट रूप से प्रतिक्रिया के लिए हमेशा के लिए इंतजार करने के बजाय, इन उदाहरणों में एक त्रुटि पृष्ठ वापस करने के लिए अपने आवेदन की तरह होगा।

ComboPooledDataSource db = new ComboPooledDataSource(); 
... 
Connection conn = db.getConnection(); 

कैसे c3p0 के कनेक्शन पूल से कनेक्शन प्राप्त करने के लिए एक समय समाप्ति सेट कर सकते हैं:

यहाँ कोड कैसा दिखता है?

मैंने सोचा कि चेकआउटटाइमआउट() यह होगा - लेकिन ऐसा नहीं है। यह "क्लाइंट कॉलिंग प्राप्त करने वाले मिलीसेकंड की संख्या कनेक्शन कनेक्शन() पूल समाप्त होने पर कनेक्शन के लिए चेक-इन या अधिग्रहण की प्रतीक्षा करेगा।" चूंकि पूल समाप्त नहीं हुआ है (यह केवल अनुपलब्ध है) यह लागू नहीं होता है।

मैंने यह भी सोचा कि सेटएक्वायर रीट्रीएट्सप्ट्स और सेटएक्वायर इंस्ट्रक्शन काम करेगा - लेकिन चूंकि कोई कनेक्शन विफल नहीं होता है, इसलिए यह प्रतिक्रिया नहीं देता है।

जब मैं पूरे ढेर खींच लिया, यह वह जगह है जहाँ यह रुक जाता:

SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]  
SocketInputStream.read(byte[], int, int) line: 129 
ReadAheadInputStream.fill(int) line: 113  
ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(byte[], int, int) line: 160  
ReadAheadInputStream.read(byte[], int, int) line: 188 
MysqlIO.readFully(InputStream, byte[], int, int) line: 2428 
MysqlIO.reuseAndReadPacket(Buffer, int) line: 2882 
MysqlIO.reuseAndReadPacket(Buffer) line: 2871 
MysqlIO.checkErrorPacket(int) line: 3414  
MysqlIO.sendCommand(int, String, Buffer, boolean, String) line: 1936  
MysqlIO.sqlQueryDirect(StatementImpl, String, String, Buffer, int, int, int, boolean, String, Field[]) line: 2060 
JDBC4Connection(ConnectionImpl).execSQL(StatementImpl, String, int, Buffer, int, int, boolean, String, Field[], boolean) line: 2542 
JDBC4PreparedStatement(PreparedStatement).executeInternal(int, Buffer, boolean, boolean, Field[], boolean) line: 1734 
JDBC4PreparedStatement(PreparedStatement).executeQuery() line: 1885 
NewProxyPreparedStatement.executeQuery() line: 76 
C3P0PooledConnectionPoolManager.initializeAutomaticTestTable(String, DbAuth) line: 799 
C3P0PooledConnectionPoolManager.createPooledConnectionPool(DbAuth) line: 696  
C3P0PooledConnectionPoolManager.getPool(DbAuth) line: 257 
C3P0PooledConnectionPoolManager.getPool() line: 271 
ComboPooledDataSource(AbstractPoolBackedDataSource).getNumThreadsAwaitingCheckoutDefaultUser() line: 203  
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] 
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 
Method.invoke(Object, Object...) line: 597 
BeansUtils.extractAccessiblePropertiesToMap(Map, Object, Collection) line: 359 
BeansUtils.appendPropNamesAndValues(StringBuffer, Object, Collection) line: 324 
ComboPooledDataSource.toString() line: 539 
ComboPooledDataSource(AbstractPoolBackedDataSource).getPoolManager() line: 462 
ComboPooledDataSource(AbstractPoolBackedDataSource).getConnection() line: 128 

जब मैं googled "socketRead0 टाइमआउट 'और' socketRead0 लटका" - मैं समस्याओं लेकिन कोई वास्तविक समाधान का एक बहुत देखते हैं।

क्या टाइमआउट अवधि को यहां लागू करने का कोई तरीका है?

धन्यवाद!

उत्तर

3

यह समस्या MySQL के ReadAheadInputStream के भीतर है, जो पढ़ने को अवरुद्ध करने का उपयोग करती है। मूल सॉकेट अवरुद्ध हो गया है और कभी भी (?) एक त्रुटि कोड देता है। तो कनेक्शन भी लटका है।

मुझे अपने कोड को थ्रेड में रखने और इसे टाइमआउट के साथ() में शामिल करने के लिए इसे संभालने का कोई तरीका नहीं दिख रहा है। मुझे विश्वास नहीं है कि समस्या जटिलताओं को सही ठहराती है: मुझे उम्मीद है कि अमेज़ॅन डाउनटाइम से सही निष्कर्ष निकाल देगा, और इसे फिर से नहीं होने देगा।

1

ठीक है, आप कनेक्शन स्तर पर एक क्वेरीटाइम असाइन कर सकते हैं। आईआईआरसी, माईएसक्यूएल इसका पालन करता है। डुनो अगर सी 3 पी 0 इसे पसंद करेंगे, लेकिन यह काम कर सकता है।

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