के साथ अप्रत्याशित रूप से बंद डेटाबेस कनेक्शन ग्लासफ़िश पर चल रहा एक जावा ईई एप्लिकेशन है और जेटीडीएस के माध्यम से एमएसएसएलएल सर्वर 2008 से कनेक्ट हो रहा है। किसी अज्ञात कारण के लिए, अनुरोध के दौरान डेटाबेस कनेक्शन अप्रत्याशित रूप से बंद हो जाता है। एप्लिकेशन बहुत बड़ा है, लेकिन यहां त्रुटि है कि त्रुटि कैसे होती है:ग्लासफ़िश, जेटीडीएस और एसक्यूएल सर्वर 2008
ग्लासफ़िश सेटअप के दौरान, asadmin create-jdbc-connection-pool
और asadmin create-jdbc-resource
के साथ कनेक्शन पूल बनाने के साथ। डेटासॉर क्लास net.sourceforge.jtds.jdbcx.JtdsDataSource
है।
जब ग्लासफ़िश ऊपर जाता है, तो यह ServletContextListener.contextInitialized() के हमारे कार्यान्वयन को कॉल करता है, जहां हम JNDI से डेटा स्रोत प्राप्त करते हैं। डेटासोर्स एक स्थिर चर पर संग्रहीत है।
थोड़ी देर के लिए, सब कुछ ठीक हो जाता है। सभी अनुरोधों को संभाला जाता है और कोई कनेक्शन बंद नहीं होता है। हमारा आवेदन टाइमर और एमडीबी (संदेश संचालित बीन) ईजेबी का उपयोग कर प्रसंस्करण करता है।
यह एक नमूना onMessage()
दिया गया है:
public void onMessage(Message message) {
this.message = message;
this.connection = dataSource.getConnection(userName, password);
try {
doQuery1();
doTransaction1();
doTransaction2();
doQuery2();
doQuery3();
} finally {
this.connection.close();
this.connection = null;
}
}
आखिरकार, हम निम्न अपवाद प्राप्त करने के लिए शुरू (होता है एक घंटे के दौरान लगभग 100 बार):
java.sql.SQLException: Invalid state, the Connection object is closed.
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.checkOpen(ConnectionJDBC2.java)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.prepareStatement(ConnectionJDBC2.java)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.prepareStatement(ConnectionJDBC2.java)
at com.sun.gjc.spi.base.ConnectionHolder.prepareStatement(ConnectionHolder.java:475)
at com.acme.myejbs.MyMDB.doQuery2(MyMDB.java:123)
at com.acme.myejbs.MyMDB.onMessage(MyMDB.java:614)
at sun.reflect.GeneratedMethodAccessor115.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
at java.lang.reflect.Method.invoke(Method.java)
at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011)
...
at $Proxy92.onMessage(Unknown Source)
at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java)
at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:77)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
अपवाद यादृच्छिक JDBC में क्या होता है कहता है। कभी-कभी परिणाम निष्पादन के दौरान होता है, क्वेरी निष्पादन के दौरान अन्य बार।
java.sql.SQLException: Error in allocating a connection. Cause: This Managed Connection is not valid as the phyiscal connection is not usable
at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:136)
at com.acme.myejbs.MyMDB.onMessage(MyMDB.java:614)
at sun.reflect.GeneratedMethodAccessor115.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
at java.lang.reflect.Method.invoke(Method.java)
at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011)
...
at $Proxy92.onMessage(Unknown Source)
at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java)
at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:77)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
इसके अलावा बहुत दुर्लभ मामलों में (5 बार एक घंटे के दौरान) यह अपवाद प्राप्त:
बहुत दुर्लभ मामलों में (एक घंटे के दौरान 7 बार) यह अपवाद मिल
java.sql.SQLException: I/O Error: Connection reset by peer: socket write error
at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java)
at com.acme.myejbs.MyMDB.doQuery2(MyMDB.java:126)
at com.acme.myejbs.MyMDB.onMessage(MyMDB.java:614)
...
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java)
at java.net.SocketOutputStream.write(SocketOutputStream.java)
at java.io.DataOutputStream.write(DataOutputStream.java)
at net.sourceforge.jtds.jdbc.SharedSocket.sendNetPacket(SharedSocket.java)
at net.sourceforge.jtds.jdbc.RequestStream.putPacket(RequestStream.java)
at net.sourceforge.jtds.jdbc.RequestStream.flush(RequestStream.java)
... 44 more
java.lang.NullPointerException
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java)
at com.acme.myejbs.MyMDB.doQuery2(MyMDB.java:126)
at com.acme.myejbs.MyMDB.onMessage(MyMDB.java:614)
...
हम ऐसा क्यों होता नहीं मिल सकता है:
दुर्लभ मामलों में हम इस डरावना अपवाद (jTDS अंदर एनपीई) मिलता है। अनुरोध के दौरान इस्तेमाल किए गए कनेक्शन एक सेकंड से अधिक समय तक निष्क्रिय नहीं होते हैं। हम नहीं जानते कि कनेक्शन कौन छोड़ रहा है। यह नेटवर्क अस्थिरता हो सकती है, लेकिन फिर मुझे लगता है कि जेटीडीएस को केवल नेटवर्क से संबंधित अपवाद पैदा करना चाहिए, है ना?
एक और विकल्प ग्लासफ़िश कनेक्शन पूल की कुछ नीति या कॉन्फ़िगरेशन है (शायद ग्लासफ़िश समय से भौतिक कनेक्शन बंद कर रहा है), लेकिन हम इसे कैसे ट्रैक कर सकते हैं?
अंत में, एमएस एसक्यूएल सर्वर 2008 दूरस्थ रूप से कनेक्शन छोड़ सकता है, लेकिन यह सर्वर पक्ष की निगरानी कैसे कर सकता है यह जानने के लिए कि यह हो रहा है या नहीं?
समस्याओं पर भी हो करो करने के लिए सबसे अधिक महत्वपूर्ण हैं जब माइक्रोसॉफ्ट JDBC ड्राइवर का उपयोग कर? – extraneon
@extraneon हमने माइक्रोसॉफ्ट जेडीबीसी ड्राइवर का परीक्षण नहीं किया। जेटीडीएस के आधार पर एक पूरी दृढ़ता परत है और एमएस में स्विच करने में कुछ दिन लगेंगे। – fernacolo
क्या आपका कोड SQLExceptions को पकड़/अनदेखा कर रहा है? क्या आप मूल डेटासोर्स या कनेक्शनपूल का उपयोग कर रहे हैं? –