मैं एक तीसरा दृष्टिकोण पसंद करता हूं जो उपयोगकर्ता1016403 द्वारा वर्णित दृष्टिकोण 1 और दृष्टिकोण 2 से सर्वश्रेष्ठ लेता है
।
दृष्टिकोण ३
- पर डेटाबेस गुण सहेजें
server.xml
server.xml
वेब अनुप्रयोग से डेटाबेस गुणों का संदर्भ लेंMETA-INF/context.xml
दृष्टिकोण 3 लाभ
जबकि पहला बिंदु सुरक्षा कारणों से उपयोगी है, दूसरा बिंदु वेब एप्लिकेशन से सर्वर गुण मानों को संदर्भित करने के लिए उपयोगी है, भले ही सर्वर गुण मान बदल जाएंगे।
इसके अलावा वेब एप्लिकेशन द्वारा उनके उपयोग से सर्वर पर संसाधन परिभाषाओं को अलग-अलग संगठनों के साथ ऐसे कॉन्फ़िगरेशन को स्केलेबल बनाया जाता है जहां विभिन्न टीमें अलग-अलग स्तरों / परतों पर काम करती हैं: सर्वर प्रशासक टीम डेवलपर्स टीम के साथ संघर्ष किए बिना काम कर सकती है यदि व्यवस्थापक एक ही साझा करता है प्रत्येक संसाधन के लिए डेवलपर के साथ JNDI नाम।
दृष्टिकोण 3 कार्यान्वयन
JNDI नाम परिभाषित करें jdbc/ApplicationContext_DatabaseName
।
टॉमकैट के jdbc/ApplicationContext_DatabaseName
विभिन्न गुणों और मूल्यों को server.xml
इस तरह से उपयोग करने की घोषणा करें:
<GlobalNamingResources>
<Resource name="jdbc/ApplicationContext_DatabaseName" auth="Container" type="javax.sql.DataSource"
username="dbUsername" password="dbPasswd"
url="jdbc:postgresql://localhost/dbname"
driverClassName="org.postgresql.Driver"
initialSize="5" maxWait="5000"
maxActive="120" maxIdle="5"
validationQuery="select 1"
poolPreparedStatements="true"/>
</GlobalNamingResources/>
विशेषता में निर्दिष्ट एप्लिकेशन-निजी JNDI संदर्भ द्वारा jdbc/ApplicationContext_DatabaseName
वेब एप्लिकेशन से गुणों को लिंक करें :META-INF/context.xml
java:comp/env/
name
<Context path="/ApplicationContext" ... >
<!--
"global" attribute links to GlobalNamingResources in the ${catalina.base}/conf/server.xml (server administrator team)
"name" attribute is relative to the application-private JNDI context java:comp/env/ and is looked up from the java web application (application developer team)
-->
<ResourceLink global="jdbc/ApplicationContext_DatabaseName" name="jdbc/DatabaseName" type="javax.sql.DataSource"/>
</Context>
अंत में, JNDI संसाधन का उपयोग करने के लिए, jdbc/DatabaseName
वेब एप्लिकेशन की तैनाती विवरणक में JNDI नाम निर्दिष्ट करें :
<resource-ref>
<description>DatabaseName's Datasource</description>
<res-ref-name>jdbc/DatabaseName</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
और वसंत संदर्भ में:
<jee:jndi-lookup id="DatabaseNameDataSource"
jndi-name="jdbc/DatabaseName"
expected-type="javax.sql.DataSource" />
दृष्टिकोण 3 कमियां
यदि JNDI नाम बदल जाता है, तो दोनों को server.xml
और META-INF/context.xml
वसीयत को संपादित करना होगा और एक तैनाती आवश्यक होगी; फिर भी यह परिदृश्य दुर्लभ है।
दृष्टिकोण 3 भिन्नता
एक वेब एप्लिकेशन द्वारा उपयोग किए जाने वाले कई डेटा स्रोत
बस टॉमकैट के लिए विन्यास जोड़ें server.xml
:
<GlobalNamingResources>
<Resource name="jdbc/ApplicationContext_DatabaseName1" ... />
<Resource name="jdbc/ApplicationContext_DatabaseName2" ... />
...
</GlobalNamingResources/>
विशेषता में निर्दिष्ट META-INF/context.xml
एप्लिकेशन-निजी JNDI संदर्भ द्वारा लिंक वेब एप्लिकेशन जोड़ें :java:comp/env/
name
<Context path="/ApplicationContext" ... >
<ResourceLink global="jdbc/ApplicationContext_DatabaseName1" name="jdbc/DatabaseName1" ... />
<ResourceLink global="jdbc/ApplicationContext_DatabaseName2" name="jdbc/DatabaseName2" ... />
...
</Context>
अंत में वेब एप्लिकेशन की तैनाती विवरणक में JNDI संसाधनों के उपयोग को जोड़ें:
<resource-ref>
<description>DatabaseName1's Datasource</description>
<res-ref-name>jdbc/DatabaseName1</res-ref-name> ...
</resource-ref>
<resource-ref>
<description>DatabaseName2's Datasource</description>
<res-ref-name>jdbc/DatabaseName2</res-ref-name> ...
</resource-ref>
...
और वसंत संदर्भ में:
<jee:jndi-lookup id="DatabaseName1DataSource"
jndi-name="jdbc/DatabaseName1" ... />
<jee:jndi-lookup id="DatabaseName2DataSource"
jndi-name="jdbc/DatabaseName2" ... />
...
एक ही सर्वर पर कई वेब एप्लिकेशन द्वारा उपयोग किए जाने वाले कई डेटा स्रोत
बस टॉमकैट के लिए कॉन्फ़िगरेशन जोड़ें server.xml
:
<GlobalNamingResources>
<Resource name="jdbc/ApplicationContextX_DatabaseName1" ... />
<Resource name="jdbc/ApplicationContextX_DatabaseName2" ... />
<Resource name="jdbc/ApplicationContextY_DatabaseName1" ... />
<Resource name="jdbc/ApplicationContextY_DatabaseName2" ... />
...
</GlobalNamingResources/>
अन्य विन्यास पिछले बदलाव के मामले से अलग होना चाहिए।
एक ही डेटाबेस के कई डेटा स्रोत एक ही सर्वर पर कई वेब एप्लिकेशन द्वारा उपयोग किए जाते हैं
ऐसे मामले में एक टॉमकैट के server.xml
विन्यास जैसे:
<GlobalNamingResources>
<Resource name="jdbc/ApplicationContextX_DatabaseName" ... />
<Resource name="jdbc/ApplicationContextY_DatabaseName" ... />
दो अलग-अलग वेब अनुप्रयोगों में समाप्त होता है META-INF/context.xml
जैसे:
<Context path="/ApplicationContextX" ... >
<ResourceLink global="jdbc/ApplicationContextX_DatabaseName" name="jdbc/DatabaseName" ... />
</Context>
और पसंद करें:
<Context path="/ApplicationContextY" ... >
<ResourceLink global="jdbc/ApplicationContextY_DatabaseName" name="jdbc/DatabaseName" ... />
</Context>
इसलिए किसी को इस तथ्य के बारे में चिंतित हो सकता है कि एक ही name="jdbc/DatabaseName"
देखा जाता है, और फिर एक ही सर्वर पर तैनात दो अलग-अलग अनुप्रयोगों द्वारा उपयोग किया जाता है: यह एक समस्या नहीं है क्योंकि jdbc/DatabaseName
एक अनुप्रयोग-निजी JNDI संदर्भ है java:comp/env/
, इसलिए इसका ApplicationContextX
उपयोगjava:comp/env/
नहीं किया जा सकता है (डिजाइन द्वारा) से जुड़े संसाधन को देखें global="jdbc/ApplicationContextY_DatabaseName"
।
बेशक अगर आप इस चिंता के बिना अधिक आराम महसूस करते हैं तो आप एक अलग नामकरण रणनीति का उपयोग कर सकते हैं:
<Context path="/ApplicationContextX" ... >
<ResourceLink global="jdbc/ApplicationContextX_DatabaseName" name="jdbc/applicationXprivateDatabaseName" ... />
</Context>
और पसंद करें:
<Context path="/ApplicationContextY" ... >
<ResourceLink global="jdbc/ApplicationContextY_DatabaseName" name="jdbc/applicationYprivateDatabaseName" ... />
</Context>
<Resource name="jdbc/ApplicationContextX_DatabaseName" ... /> <Resource name="jdbc/ApplicationContextY_DatabaseName" ... />
यदि संसाधन कनेक्शन पूल थे, तो क्या इससे आपको दो अलग-अलग पूल मिलेंगे, प्रति वेबपेज एक? जबकि, अगर मैं दोनों webapps से एक संसाधन से जुड़ा हूं, तो सिर्फ एक कनेक्शन पूल होगा, सही? किसी एक को पसंद करने के लिए कोई कारण? (अलग डीबी कनेक्शन पूल प्रति वेबएप बनाम एक कनेक्शन पूल जो सभी वेबएप द्वारा साझा किया गया है)? धन्यवाद।