स्प्रिंग में टॉमकैट द्वारा प्रदान किए गए जेएनडीआई डेटा स्रोत का उपयोग कैसे करें?


159

यह कहा जाता है कि वसंत javadoc लेख में DriverManagerDataSourceकक्षा के बारे में , कि यह वर्ग बहुत सरल है और इसकी सिफारिश की जाती है

कंटेनर द्वारा प्रदान JNDI डेटा स्रोत का उपयोग करने के लिए। इस तरह के एक स्प्रिंग ApplicationContext के माध्यम से DataSourceएक DataSourceसेम के रूप में उजागर किया जा सकता हैJndiObjectFactoryBean

सवाल यह है: मैं इसे कैसे पूरा करूं?

उदाहरण के लिए, यदि मैं DataSourceअपने कस्टम MySQL डेटाबेस तक पहुँचने के लिए बीन लेना चाहता हूं, तो मुझे क्या आवश्यकता होगी? मुझे संदर्भ कॉन्फ़िगरेशन में क्या लिखना चाहिए, आदि।

जवाबों:


302

यदि स्प्रिंग के XML स्कीमा आधारित कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो इस तरह से स्प्रिंग संदर्भ में सेटअप करें:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
...
<jee:jndi-lookup id="dbDataSource"
   jndi-name="jdbc/DatabaseName"
   expected-type="javax.sql.DataSource" />

वैकल्पिक रूप से, इस तरह सरल बीन विन्यास का उपयोग कर सेटअप:

<bean id="DatabaseName" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/DatabaseName"/>
</bean>

आप इस तरह से कुछ का उपयोग करके tomcat के server.xml में JNDI संसाधन की घोषणा कर सकते हैं:

<GlobalNamingResources>
    <Resource name="jdbc/DatabaseName"
              auth="Container"
              type="javax.sql.DataSource"
              username="dbUser"
              password="dbPassword"
              url="jdbc:postgresql://localhost/dbname"
              driverClassName="org.postgresql.Driver"
              initialSize="20"
              maxWaitMillis="15000"
              maxTotal="75"
              maxIdle="20"
              maxAge="7200000"
              testOnBorrow="true"
              validationQuery="select 1"
              />
</GlobalNamingResources>

और जेएनडीआई संसाधन को टॉमकैट के वेब संदर्भ से संदर्भित करें। xml इस प्रकार है:

  <ResourceLink name="jdbc/DatabaseName"
   global="jdbc/DatabaseName"
   type="javax.sql.DataSource"/>

संदर्भ प्रलेखन:

संपादित करें: यह उत्तर टॉमकैट 8 और स्प्रिंग 4 के लिए अद्यतन किया गया है। टॉमकैट के डिफ़ॉल्ट डेटा स्रोत संसाधन पूल सेटअप के लिए कुछ संपत्ति नाम परिवर्तन हुए हैं ।


@skaffman हां, लेकिन आप स्प्रिंग संदर्भ प्रलेखन के लिए एक लिंक प्रदान करते हैं।
इतिने मिरत

"टॉमकैट के वेब संदर्भ.एक्सएमएल" का क्या मतलब है?
पावेल निदोबा

1
@PavelNiedoba Tomcat टोमकैट विशिष्ट वेब ऐप कॉन्फ़िगरेशन के लिए "संदर्भ" का उपयोग करता है। संदर्भ फ़ाइल और / या संदर्भ कॉन्फ़िगरेशन को विभिन्न स्थानों में रखा जा सकता है, इसलिए मैं आपको एक निश्चित उत्तर नहीं दे सकता। एक सामान्य स्थान "/META-INF/context.xml" है। यहां "एक संदर्भ को परिभाषित करना" अनुभाग देखें: tomcat.apache.org/tomcat-8.0-doc/config/…
kaliatech

मम्म ... मेरे oracle db के लिए काम नहीं कर रहा है, postgresql के साथ कोई मतभेद?
8

1
@PD JDBC / JNDI / Tomcat स्तर पर Oracle बनाम PostgreSQL के साथ कोई बुनियादी अंतर नहीं हैं। हालाँकि, Oracle Oracle क्लाइंट / सर्वर सेटअप विवरण की बात करते समय PostgreSQL से बहुत अलग है। मूल प्रश्न / उत्तर के दायरे से बाहर। आपने क्या प्रयास किया है, विशिष्ट संस्करण और किसी भी त्रुटि संदेश के विवरण के साथ एक नया प्रश्न पोस्ट करने का सुझाव दें। उदाहरण: stackoverflow.com/questions/10388137/…
kaliatech

52

स्प्रिंग के जावा कॉनफिग तंत्र के साथ, आप इसे ऐसा कर सकते हैं:

@Configuration
public class MainConfig {

    ...

    @Bean
    DataSource dataSource() {
        DataSource dataSource = null;
        JndiTemplate jndi = new JndiTemplate();
        try {
            dataSource = jndi.lookup("java:comp/env/jdbc/yourname", DataSource.class);
        } catch (NamingException e) {
            logger.error("NamingException for java:comp/env/jdbc/yourname", e);
        }
        return dataSource;
    }

}

2
या अधिक विशिष्ट JndiDataSourceLookup का
Arend v। Reinersdorff

21

मान लें कि आपके टॉमकैट कॉन्फ़िगरेशन के अंदर एक "सैंपलड्स" डेटासोर्स की परिभाषा है, तो आप जेएनडीआई applicationContext.xmlका उपयोग करके डेटा स्रोत तक पहुंचने के लिए अपनी निम्न पंक्तियाँ जोड़ सकते हैं ।

<jee:jndi-lookup expected-type="javax.sql.DataSource" id="springBeanIdForSampleDS" jndi-name="sampleDS"/>

आपको jeeउपसर्ग के लिए नामस्थान और स्कीमा स्थान को परिभाषित करना होगा :

xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"

15

प्रलेखन: C.2.3.1 <jee:jndi-lookup/>(सरल)

उदाहरण:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>

आपको बस यह पता लगाना है कि आपके प्रशिक्षक ने JNDI का नाम क्या रखा है। यह पूरी तरह से सर्वर-विशिष्ट है, यह जानने के लिए अपने सर्वर पर डॉक्स से परामर्श करें कि कैसे।

jeeअपनी सेम फ़ाइल के शीर्ष पर नाम स्थान घोषित करने के लिए याद रखें , जैसा कि C.2.3 जी स्कीमा में वर्णित है ।


8

एक अन्य विशेषता: server.xml के बजाय, आप इस तरह से अपने संसाधन
/ META-INF / Context.xml ( tomcat डॉक्स के अनुसार ) में "संसाधन" टैग जोड़ सकते हैं :

<Context>
<Resource name="jdbc/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"/>
</Context>


4

अपने वसंत वर्ग में, आप एक सेम एनोटेट की तरह इंजेक्ट कर सकते हैं

@Autowired
@Qualifier("dbDataSource")
private DataSource dataSource;

और आप इसे अपने संदर्भ में जोड़ें। xml

<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>

आप का उपयोग कर tomcat के server.xml में JNDI संसाधन की घोषणा कर सकते हैं

<Resource name="jdbc/TestDB" 
  global="jdbc/TestDB" 
  auth="Container" 
  type="javax.sql.DataSource" 
  driverClassName="com.mysql.jdbc.Driver" 
  url="jdbc:mysql://localhost:3306/TestDB" 
  username="pankaj" 
  password="pankaj123" 

  maxActive="100" 
  maxIdle="20" 
  minIdle="5" 
  maxWait="10000"/>

संदर्भ पर वापस जाएं। xml de spring इसे जोड़ें

<ResourceLink name="jdbc/MyLocalDB"
                global="jdbc/TestDB"
                auth="Container"
                type="javax.sql.DataSource" />

यदि, इस छूट की तरह आप डेटाबेस से कनेक्शन इंजेक्ट कर रहे हैं, तो सुनिश्चित करें कि MySQL जार टॉमकैट लिबरी डायरेक्टरी में मौजूद है, अन्यथा टॉमकैट MySQL डेटाबेस कनेक्शन पूल बनाने में सक्षम नहीं होगा।


1

मुझे यह समाधान xml कॉन्फ़िगरेशन को पूरी तरह से हटाने के लिए एक साफ तरीके से बहुत उपयोगी लगा।

कृपया जेएनडीआई और वसंत ढांचे का उपयोग करके इस डीबी कॉन्फ़िगरेशन की जांच करें। http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

इस लेख के द्वारा, यह समझाता है कि डेटाबेस jndi (db / test) कॉन्फ़िगरेशन के आधार पर db कन्फ़िगरेशन बनाना कितना आसान है। एक बार जब आप कॉन्फ़िगरेशन के साथ किया जाता है, तो इस jndi का उपयोग करके सभी db रिपॉजिटरी लोड की जाती हैं। मुझे उपयोगी लगा। अगर @ पियरे ने इसे जारी किया है तो मुझे बताएं। यह db कॉन्फ़िगरेशन लिखने के लिए पूर्ण समाधान है।


इस लेख के द्वारा, यह समझाता है कि डेटाबेस jndi (db / test) कॉन्फ़िगरेशन के आधार पर db कन्फिगरेशन बनाना कितना आसान है। एक बार जब आप कॉन्फ़िगरेशन के साथ किया जाता है तो इस dndi का उपयोग करके सभी db रिपॉजिटरी लोड की जाती हैं। मुझे उपयोगी लगा। अगर @ पियरे ने इसे जारी किया है तो मुझे बताएं। यह db कॉन्फ़िगरेशन लिखने के लिए पूर्ण समाधान है।
user3892286

इस लेख के द्वारा, यह समझाता है कि डेटाबेस jndi (db / test) कॉन्फ़िगरेशन के आधार पर db कन्फिगरेशन बनाना कितना आसान है। एक बार जब आप कॉन्फ़िगरेशन के साथ किया जाता है तो इस dndi का उपयोग करके सभी db रिपॉजिटरी लोड की जाती हैं। मुझे उपयोगी लगा। अगर @ पियरे ने इसे जारी किया है तो मुझे बताएं। यह db कॉन्फ़िगरेशन लिखने के लिए पूर्ण समाधान है।
सर्जियो ए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.