2009-07-25 20 views
5

वास्तुकला में कई धागे के साथ जेडीबीसी को संभालने का सबसे अच्छा तरीका क्या है? मेरे पास डेटाबेस के साथ-साथ कई थ्रेड हैं। एक कनेक्शन और कथन के साथ मुझे निम्न त्रुटि संदेश मिलता है:मल्टीथ्रेडेड जेडीबीसी

org.postgresql.util.PSQLException: यह परिणाम सेट बंद है।

क्या मुझे एकाधिक कनेक्शन, एकाधिक कथन का उपयोग करना चाहिए या क्या कोई बेहतर तरीका है? मेरा प्रारंभिक विचार प्रति थ्रेड एक कथन का उपयोग करना था जो प्रत्येक कथन के एक एकल परिणाम सेट की गारंटी देगा।

उत्तर

4

आपको प्रति कार्य एक कनेक्शन का उपयोग करना चाहिए। यदि आप कनेक्शन पूलिंग का उपयोग करते हैं तो आप किसी अन्य कनेक्शन द्वारा तैयार तैयार बयान का उपयोग नहीं कर सकते हैं। कनेक्शन द्वारा बनाए गए सभी ऑब्जेक्ट्स (ResultSet, PreparedStatements) पूल में कनेक्शन के बाद उपयोग के लिए अमान्य हैं।

इसलिए, यह इस मामले आपके सभी डीएओ वस्तुओं कनेक्शन नहीं ले में एक जैसे है

public void getSomeData() { 
    Connection conn = datasource.getConnection(); 
    PreparedStatement st; 
    try { 
    st = conn.prepareStatement(...); 
    st.execute(); 
    } finally { 
    close(st); 
    close(conn); 
    } 
} 

तो, लेकिन डेटा स्रोत ऑब्जेक्ट (java.sql.DataSource) जो वास्तव में poolable कनेक्शन कारखाना है। और प्रत्येक विधि में आप सबसे पहले कनेक्शन प्राप्त करते हैं, अपने सभी काम और घनिष्ठ कनेक्शन करें। आपको जितनी जल्दी हो सके पूल से कनेक्शन वापस करना चाहिए। कनेक्शन लौटने के बाद यह शारीरिक रूप से बंद नहीं हो सकता है, लेकिन फिर से शुरू किया गया (सभी सक्रिय लेनदेन बंद हो गए, सभी सत्र चर नष्ट हो गए आदि)

1

हां, कनेक्शन पूल के साथ कई कनेक्शन का उपयोग करें। आपको जो कुछ भी चाहिए, उसे करने के लिए पर्याप्त लंबे समय तक कनेक्शन खोलें, फिर जितनी जल्दी हो सके इसे बंद करें। कनेक्शन पूल को दक्षता के लिए "भौतिक" कनेक्शन प्रबंधन का ख्याल रखना चाहिए।

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