2011-11-18 7 views
5

के साथ अप्रत्याशित रूप से बंद डेटाबेस कनेक्शन ग्लासफ़िश पर चल रहा एक जावा ईई एप्लिकेशन है और जेटीडीएस के माध्यम से एमएसएसएलएल सर्वर 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 दूरस्थ रूप से कनेक्शन छोड़ सकता है, लेकिन यह सर्वर पक्ष की निगरानी कैसे कर सकता है यह जानने के लिए कि यह हो रहा है या नहीं?

+0

समस्याओं पर भी हो करो करने के लिए सबसे अधिक महत्वपूर्ण हैं जब माइक्रोसॉफ्ट JDBC ड्राइवर का उपयोग कर? – extraneon

+0

@extraneon हमने माइक्रोसॉफ्ट जेडीबीसी ड्राइवर का परीक्षण नहीं किया। जेटीडीएस के आधार पर एक पूरी दृढ़ता परत है और एमएस में स्विच करने में कुछ दिन लगेंगे। – fernacolo

+0

क्या आपका कोड SQLExceptions को पकड़/अनदेखा कर रहा है? क्या आप मूल डेटासोर्स या कनेक्शनपूल का उपयोग कर रहे हैं? –

उत्तर

1

कोशिश एसक्यूएल सर्वर प्रोफाइलर http://msdn.microsoft.com/en-us/library/ms187929.aspx उपयोग करने के लिए आप एक टेम्पलेट "मानक" के साथ शुरू कर सकते हैं, क्योंकि यह घटनाओं में शामिल हैं: ऑडिट लॉग इन, लेखा परीक्षा लॉगआउट, ExistingConnection http://msdn.microsoft.com/en-us/library/ms190176.aspx मुझे लगता है कि वे आप

2

मेरे पास एक ऐसा एप्लिकेशन था जिसने इन प्रकार के अपवादों को लगभग बिल्कुल प्राप्त किया था। मेरी सभी मशीनें ब्रांड नए सर्वर थीं और सभी नेटवर्क कार्ड नेटवर्क की गति को स्वतः समझने के लिए सेट किए गए थे। वे सभी पुराने स्विच से जुड़े थे जो 100 एमबी/सेकेंड हाफ डुप्लेक्स था।

ऑटो स्विच के बजाय 100 एमबी/सेकेंड हाफ डुप्लेक्स कनेक्शन सेटिंग का स्पष्ट रूप से उपयोग करने के लिए उस स्विच पर सभी मशीनों को सेट करना, समाधान के लिए अनगिनत घंटे करने के बाद मेरे लिए क्या काम करता था। आपको यह पता लगाना होगा कि आपकी कनेक्टिविटी सेटिंग्स क्या होनी चाहिए या प्रयोग करें (यदि आप गलत चुनते हैं तो यह स्पष्ट होगा क्योंकि आप दूरस्थ डेस्कटॉप पर बॉक्स से कनेक्ट नहीं कर पाएंगे, इसलिए सुनिश्चित करें कि आप भौतिक मशीन)।

यह परीक्षण करने के लिए बहुत कम लटकते फल है। मैंने डेटाबेस सर्वर को पिंग करने वाली वर्कर मशीनों में से एक से पिंग कमांड के साथ एक कमांड विंडो सेट की है और समय-समय पर पैकेट नुकसान देख सकता है। एक बार जब मैंने एनआईसी सेटिंग्स बदल दी और इसे सही पाया, तो समस्या पूरी तरह से चली गई। इस समस्या पर चर्चा करने वाले इंटरनेट पर कई लेख हैं। यह नीचे ट्रैक करने के लिए है क्योंकि यह मुश्किल है: 1) समय-समय पर और 2) की तरह कुछ कनेक्शन वस्तुओं के साथ गलत है लग रहा है, आदि