2017-12-08 15 views
5

सरलीकृत स्थिति:बिलाव: 1 युद्ध, तैनात 2x, 2 कॉन्फ़िगरेशन

  • मैं 1 बिलाव कंटेनर और 1 युद्ध जो एक डेटाबेस का उपयोग करता है।
  • डेटाबेस कॉन्फ़िगरेशन एक गुण फ़ाइल ( युद्ध में) में बैठता है।
  • मैंने डब्ल्यूएआर 2 बार तैनात किया, संदर्भपैथ /a पर एक वेबपैप और संदर्भपैथ /b पर एक वेबपैप।
  • दोनों वेबैप अब उसी डेटाबेस (उसी सीएफजी) को इंगित करते हैं।

मुझे क्या चाहिए कि प्रत्येक वेबपैप विभिन्न डेटाबेस पर इंगित करता है। तो, /a पर वेबपैड पर और /b पर वेबपैप को बी पर इंगित करता है।

आप इसे कैसे हल करेंगे? (युद्ध को स्वयं विभाजित किए बिना)

+1

अलग-अलग डेटाबेस को इंगित करने के लिए प्रत्येक युद्ध की कॉन्फ़िगरेशन फ़ाइलों को क्यों न बदलें? –

+1

@LukeBajada: मैं * 2 युद्धों को बनाने के लिए * पसंद नहीं करता, सिर्फ इसलिए कि एक या दो गुण भिन्न हैं। – codesmith

+0

@ हेनरी: env vars या system Properties सिस्टम विस्तृत हैं और इस प्रकार कंटेनर चौड़ा है और इस प्रकार युद्ध-विशिष्ट नहीं है। कृपया समझाएँ। – codesmith

उत्तर

9

आप इसे अपने कोड को विभाजित किए बिना टोमकैट के context.xml कॉन्फ़िगरेशन द्वारा कर सकते हैं।

आप उदाहरण /a और /b और दो अलग अलग वैश्विक डेटा स्रोतों "sharedDataSourceA" और "sharedDataSourceB" के लिए दो संदर्भ परिभाषित कर सकते हैं। आप "appDataSource" जैसे नामों के साथ इन संदर्भों के लिए विभिन्न वैश्विक डेटा स्रोतों को बाध्य कर सकते हैं।

<GlobalNamingResources> 
    ... 
    <Resource name="sharedDataSourceA" 
      global="sharedDataSourceA" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      alternateUsernameAllowed="true" 
      username="bar" 
      password="barpass" 
      ... 
<Resource name="sharedDataSourceB" 
      global="sharedDataSourceB" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      alternateUsernameAllowed="true" 
      username="bar" 
      password="barpass" 
      ... 
    ... 
</GlobalNamingResources> 

<Context path="/a"...> 
    ... 
    <ResourceLink 
      name="appDataSource" 
      global="sharedDataSourceA" 
      type="javax.sql.DataSource" 
      factory="org.apache.naming.factory.DataSourceLinkFactory" 
      username="foo" 
      password="foopass" 
    ... 
</Context> 
<Context path="/b"...> 
    ... 
    <ResourceLink 
      name="appDataSource" 
      global="sharedDataSourceA" 
      type="javax.sql.DataSource" 
    ... 
</Context> 

फिर अपने कोड में आप डेटा स्रोत "appDataSource" करने के लिए JNDI देखने से बाध्य कर सकते हैं। उसी युद्ध को /a और /b पर तैनात करें। वे विभिन्न डेटाबेस पर काम करेंगे।

2

आप वर्तमान संदर्भ प्रोग्रामेटिक रूप से प्राप्त कर सकते हैं और प्राप्त मूल्य के अनुसार डेटा स्रोत को कॉन्फ़िगर कर सकते हैं। उदाहरण के लिए javax.servlet.ServletContext.getContextPath() का उपयोग कर।

आप संदर्भ नाम के अनुसार एक गुण फ़ाइल भी लोड कर सकते हैं।

0

getContextPath() सुझाव दिया गया था, और यहाँ getInitParameter()

के साथ उपयोग करने के लिए एक उदाहरण के रूप में एक तकनीक है, यदि आप दो संदर्भ में है है: "/dev" और "/prod" - दोनों indentical - और

<context-param> 
    <param-name>database_ip_prod</param-name> 
    <param-value>192.168.1.10</param-value> 
</context-param> 

<context-param> 
    <param-name>database_ip_dev</param-name> 
    <param-value>127.0.0.1</param-value> 
</context-param> 

और इस तरह एक विधि के साथ:

आप की तरह प्रविष्टियों के साथ अपने web.xml फ़ाइल सेट
public String getContextInitParam(
     javax.servlet.ServletContext context, String key) { 
    key += context.getContextPath().replace("/","_"); 
    return context.getInitParameter(key); 
} 

एक jsp या सर्वलेट से इस तरह एक कॉल:

getContextInitParam (अनुरोध।getServletContext(), "डेटाबेस_आईपी");

/dev संदर्भ पर /prod संदर्भ पर 192.168.1.10 हो जाएंगे और 127.0.0.1

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