2011-10-07 8 views
12

क्या यह जेएनडीआई स्तर पर या वेबएप स्तर पर कनेक्शन पूल के लिए अधिक समझ में आता है? उदाहरण के लिए, मैं बस javax.sql.DataSource thusly पर बना सकते हैं:कनेक्शन पूल या डेटा स्रोत? मुझे जेएनडीआई में क्या रखा जाना चाहिए?

<Context antiJARLocking="true"> 
    <Resource name="jdbc/myDataSource" 
    auth="Container" 
    type="javax.sql.DataSource" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost/myDataSource" user="user" password="password" /> 
</Context> 

और फिर thusly वसंत में पूल कॉन्फ़िगर करें:

<bean id="myDataSource" class="com.mchange.v2.c3p0.DataSources" 
    factory-method="pooledDataSource"> 
    <constructor-arg> 
    <jee:jndi-lookup jndi-name="java:comp/env/jdbc/myDataSource" /> 
    </constructor-arg> 
</bean> 

या, मैं JNDI अपने आप में सीधे पूल कॉन्फ़िगर कर सकते हैं: इस वसंत

<Resource name="jdbc/myDataSource" 
    auth="Container" 
    factory="org.apache.naming.factory.BeanFactory" 
    type="com.mchange.v2.c3p0.ComboPooledDataSource" 
    driverClassName="com.mysql.jdbc.Driver" 
    jdbcUrl="jdbc:mysql://localhost/myDataSource" 
    user="user" password="password" 
    minPoolSize="3" 
    maxPoolSize="15" 
    maxIdleTime="5000" 
    idleConnectionTestPeriod="300" 
    acquireIncrement="3" /> 

छोड़कर:

<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" /> 

दोनों मामलों में, myDataSource वसंत बीन एक c3p0 कनेक्शन पूल डेटा स्रोत होगा, लेकिन कौन सा बेहतर है? मैं सोच रहा हूं कि जेएनडीआई में पूल सबसे ज्यादा समझ में आता है, लेकिन इसका नकारात्मक पक्ष यह है कि आपको अपने c3p0 lib को सर्वलेट कंटेनर स्तर पर धक्का देना चाहिए जो मौजूदा सर्लेट्स के साथ संघर्ष कर सकता है यदि वे वर्तमान में एक अलग संस्करण का उपयोग करते हैं। हालांकि, इसे जेएनडीआई में डालने का मतलब है कि आपके आवेदनों को पूलिंग के बारे में चिंता करने की ज़रूरत नहीं है। आप क्या सोचते हैं?

+0

कर (कि जब प्रत्येक आवेदन स्वयं के पूल यह है का उपयोग शुरू होता है) जिस तरह से आप चाहें, अगर आप कर सकते हैं। यदि संभव हो, तो निश्चित रूप से इसे एक ही स्थान पर रखना सर्वोत्तम है। – EJP

उत्तर

23

आप डेटा स्रोत, JNDI से प्राप्त पूल करने के लिए के रूप में यह पहले से ही जमा है :) की जरूरत नहीं है

एक कंटेनर-प्रबंधक पूल वी.एस. होने के बीच फर्क सिर्फ इतना है एप्लिकेशन पूल यह है कि 1 मामले में आपके पास मानक इंटरफेस (उदा। जेबॉस कंसोल) का उपयोग करके पूल पर वर्कलोड की निगरानी करने की क्षमता है। फिर यदि आवश्यक हो तो आवेदन सर्वर के व्यवस्थापक पूल आकार को बढ़ाने के निर्णय का प्रबंधन करते हैं। वह एप्लिकेशन को किसी अन्य डीबी सर्वर पर भी स्विच कर सकता है (उदाहरण के लिए MySQL से Oracle तक नियोजित माइग्रेशन)। नुकसान यह है कि आपको अपने यूनिट परीक्षणों के लिए जेएनडीआई परीक्षण डेटा स्रोत स्थापित करने के लिए थोड़ा और प्रयास करने की आवश्यकता है (here देखें)।

और दूसरे मामले में, हाँ, आपको या तो आवेदन के साथ डीबीसीपी या सी 3 पी 0 प्लस जेडीबीसी ड्राइवर को पैकेज करना होगा। इस मामले में टॉमकैट में चल रहे सभी एप्लिकेशन के लिए सभी पूलों के आंकड़े एकत्र करना इतना आसान नहीं है। इसके अलावा नए जेडीबीसी ड्राइवर (MySQL 4 से MySQL 5) में माइग्रेशन सभी अनुप्रयोगों के लिए एक ही समय में नहीं किया जा सकता है। और कनेक्शन गुणों को आपके आवेदन के लिए तार दिया जाता है, भले ही आप .property फ़ाइल का उपयोग करें (इसलिए उस प्रक्रिया को फिर से बदलना और परियोजना की पुनर्वितरण की आवश्यकता है)। शायद आपको इसकी आवश्यकता नहीं है, क्योंकि आपके पास केवल एप्लिकेशन है, एक डीबी और कोई प्रबंधन ओवरहेड नहीं है।

इस विषय पर अधिक विषय:

+5

टॉमकैट जेडीबीसी पूल (http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html) भी है जिसे ध्यान में रखा जाना चाहिए। – rit

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