2010-08-19 11 views
7

मैं एक SQL सर्वर डेटाबेस के शीर्ष पर एक पतली परत बनाने के लिए स्प्रिंग एमवीसी का उपयोग कर रहा हूं। जब मैंने परीक्षण करना शुरू किया, ऐसा लगता है कि यह तनाव को बहुत अच्छी तरह से संभाल नहीं करता है :)। मैं कनेक्शन पूलिंग और डेटा स्रोत को संभालने के लिए Apache Commons DBCP का उपयोग कर रहा हूं।वसंत और डीबीसीपी के साथ जेडीबीसी कनेक्शन को संभालने का सही तरीका क्या है?

जब मैंने पहली बार ~ 10-15 एक साथ कनेक्शन का प्रयास किया, तो यह लटकता था और मुझे सर्वर को पुनरारंभ करना होगा (देव के लिए मैं टोमकैट का उपयोग कर रहा हूं, लेकिन मुझे अंततः वेबलॉगिक पर तैनाती करनी होगी)।

ये मेरी वसंत सेम परिभाषाएं दी गई हैं:

<bean id="dataSource" destroy-method="close" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> 
    <property name="url" value="[...]"/> 
    <property name="username" value="[...]" /> 
    <property name="password" value="[...]" /> 
</bean> 

<bean id="partnerDAO" class="com.hp.gpl.JdbcPartnerDAO"> 
    <constructor-arg ref="dataSource"/> 
</bean> 

<!-- + other beans --> 

और यह कैसे मैं उन्हें इस्तेमाल है:

// in the DAO 
public JdbcPartnerDAO(DataSource dataSource) { 
    jdbcTemplate = new JdbcTemplate(dataSource); 
} 

// in the controller 
@Autowired 
private PartnerDAO partnerDAO; 

// in the controller method 
Collection<Partner> partners = partnerDAO.getPartners(...); 

एक छोटा सा चारों ओर पढ़ने के बाद, मैं के लिए maxWait, maxActive और maxIdle गुण पाया BasicDataSource (GenericObjectPool से)। यहां समस्या आती है। मुझे यकीन नहीं है कि मुझे उन्हें कैसे सेट करना चाहिए, प्रदर्शन के अनुसार। जो मुझे पता है, वसंत को मेरे कनेक्शन का प्रबंधन करना चाहिए, इसलिए मुझे उन्हें रिहा करने के बारे में चिंता करने की ज़रूरत नहीं है।

<bean id="dataSource" destroy-method="close" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> 
    <property name="url" value="[...]"/> 
    <property name="username" value="[...]" /> 
    <property name="password" value="[...]" /> 
    <property name="maxWait" value="30" /> 
    <property name="maxIdle" value="-1" /> 
    <property name="maxActive" value="-1" /> 
</bean> 

पहले, मैं maxWait निर्धारित करते हैं, इतना है कि यह लटका नहीं होता है और इसके बजाय एक अपवाद फेंक जब कोई संबंध पूल से उपलब्ध था। अपवाद संदेश था:

जेडीबीसी कनेक्शन नहीं मिल सका; नेस्टेड अपवाद org.apache.commons.dbcp.SQLNestedException है: एक कनेक्शन प्राप्त नहीं कर सकता, पूल त्रुटि टाइमआउट बेकार वस्तु

लिए इंतज़ार कर रहे कुछ लंबे समय से चल प्रश्नों हैं, लेकिन अपवाद क्वेरी जटिलता की परवाह किए बिना फेंक दिया गया था।

फिर, मैंने maxActive और maxIdle सेट किया ताकि वह अपवाद को पहले स्थान पर नहीं फेंक सके। डिफ़ॉल्ट मान maxActive और maxIdle के लिए 8 हैं (मुझे समझ में नहीं आता क्यों); अगर मैं उन्हें -1 पर सेट करता हूं तो कोई और अपवाद फेंक नहीं जाता है और सबकुछ ठीक काम करने के लिए लगता है।

ध्यान दें कि इस ऐप को बड़ी संख्या में समवर्ती अनुरोधों का समर्थन करना चाहिए, क्या इन सेटिंग्स को अनंत तक छोड़ना ठीक है? क्या स्प्रिंग वास्तव में मुझे प्राप्त त्रुटियों पर विचार कर मेरे कनेक्शन का प्रबंधन करेगा? क्या मुझे C3P0 पर स्विच करना चाहिए क्योंकि यह थोड़े मृत पर विचार कर रहा है?

+0

यदि आपको कोई अपवाद मिल रहा है, तो स्टैकट्रैक पोस्ट करने से समस्या आसानी से पहचानने में मदद मिलेगी, क्या कोई लंबा चलने वाला प्रश्न है जहां आप समस्याएं देख रहे हैं? –

+0

मैंने अपवाद संदेश और कुछ अतिरिक्त जानकारी के साथ अपनी पोस्ट अपडेट की है। –

उत्तर

6

जैसा कि आप पहले से ही पता चला है, डिफ़ॉल्ट डीबीसीपी कनेक्शन पूल 8 कनेक्शन है, इसलिए यदि आप 9 एक साथ पूछना चाहते हैं तो उनमें से एक अवरुद्ध हो जाएगा।मेरा सुझाव है कि आप अपने डेटाबेस से कनेक्ट करें और exec sp_who2 चलाएं जो आपको दिखाएगा कि क्या जुड़ा हुआ है, और सक्रिय है, और क्या कोई प्रश्न अवरुद्ध किया जा रहा है। फिर आप पुष्टि कर सकते हैं कि समस्या डीबी पर है या आपके कोड में है।

जब तक आप वस्तुओं के रूप में आप उम्मीद कर अपने कनेक्शन प्रबंधित किया जाएगा के वसंत के JdbcTemplate परिवार उपयोग कर रहे हैं, और आप एक कच्चे डेटा स्रोत उपयोग करना चाहते हैं आप DataSourceUtils का प्रयोग कर एक कनेक्शन प्राप्त करने के लिए सुनिश्चित करें।

एक अन्य सुझाव - 3 वसंत के, कभी JdbcTemplate का उपयोग नहीं करते हैं, SimpleJdbcTemplate से चिपके, आप अभी भी SimpleJdbcTemplate.getJdbcOperations() का उपयोग कर एक ही तरीके का उपयोग कर सकते हैं, लेकिन आप खोजना चाहिए अपने आप को जेनरिक का उपयोग कर बहुत अच्छा कोड लिखने, और की आवश्यकता को दूर पहले कभी भी जेडीबीसी टेम्पलेट/नामांकित पैरामीटर जेडीबीसी टेम्पलेट उदाहरण बनाने के लिए।

2

चलिए परिप्रेक्ष्य बदलते हैं।

लेकिन अपवाद क्वेरी जटिलता की परवाह किए बिना फेंक दिया गया था

यह हो सकता है क्योंकि तालिका या तालिका, जो आप (कुछ अन्य सक्रिय लेन-देन से के खिलाफ लॉक हो गया है में जानना चाहते हैं में रिकॉर्ड) और इसलिए यह समय समाप्त हो गया।

SQLServer क्लाइंट से एक ही क्वेरी चलाने का प्रयास करें और यदि इसमें लंबा समय लगता है, तो आप यह सुनिश्चित कर सकते हैं कि यह तालिका या रिकॉर्ड लॉक है जो इसका कारण बन रहा है।

+0

मैं आपका बिंदु देखता हूं, लेकिन जब मैं डेटा स्रोत के 'maxActive' और 'maxIdle' पैरामीटर को एक बड़े मान (या अनंत) पर सेट करता हूं तो समस्या पूरी तरह से गायब हो जाती है। यह मुझे लगता है कि यह मुद्दा ConnectionPool से है, क्योंकि अपवाद संदेश बताता है। –

8

डीबीसीपी maxWait पैरामीटर मिलीसेकंड में परिभाषित किया जाना चाहिए। 30 एमएस बहुत कम मूल्य है, इसे 30000 एमएस तक बढ़ाने पर विचार करें और पुनः प्रयास करें।

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