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