İlkbaharda Tomcat tarafından sağlanan JNDI DataSource nasıl kullanılır?


159

Bahar hakkında javadoc'un DriverManagerDataSourcesınıfla ilgili makalesinde , bu sınıfın çok basit olduğu ve tavsiye edildiği söylenir.

tarafından sağlanan bir JNDI DataSource kullanmak için. Böyle bir DataSource, DataSourcebir Spring ApplicationContext içinde bir fasulye olarak maruz bırakılabilir.JndiObjectFactoryBean

Soru şu: Bunu nasıl başarabilirim?

Örneğin, DataSourceözel MySQL veritabanına erişmek için fasulyeye sahip olmak istersem, ne yapmam gerekir? Bağlam yapılandırmasında vb. Ne yazmalıyım?

Yanıtlar:


302

Spring'in XML şeması tabanlı yapılandırmasını kullanıyorsanız, Spring bağlamında aşağıdaki gibi kurulum yapın:

<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" />

Alternatif olarak, aşağıdaki gibi basit fasulye yapılandırmasını kullanarak kurulum yapın:

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

Tomcat'in server.xml dosyasında JNDI kaynağını aşağıdaki gibi bir şey kullanarak bildirebilirsiniz:

<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>

Ve Tomcat'in web context.xml dosyasındaki JNDI kaynağına şöyle bakın:

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

Referans belgeleri:

Düzenleme: Bu yanıt Tomcat 8 ve Spring 4 için güncellendi. Tomcat'in varsayılan veri kaynağı kaynak havuzu kurulumu için birkaç özellik adı değişikliği yapıldı .


@skaffman Evet, ancak Bahar başvuru belgelerine bir bağlantı sağlıyorsunuz.
Etienne Miret

"Tomcat'in web context.xml" ile tam olarak ne dosyayı kastediyorsunuz?
Pavel Niedoba

1
@PavelNiedoba Tomcat, tomcat'e özgü web uygulaması yapılandırması için bir "bağlam" kullanır. Bağlam dosyası ve / veya bağlam yapılandırması çeşitli konumlara yerleştirilebilir, bu yüzden size kesin bir cevap veremem. Ortak bir konum "/META-INF/context.xml" dir. Buradaki "Bir bağlam tanımlama" bölümüne bakın: tomcat.apache.org/tomcat-8.0-doc/config/…
kaliatech

Mmm ... benim oracle db için çalışmıyor gibi görünüyor, postgresql ile herhangi bir fark var mı?
Phate

1
@Phate Oracle ile PostgreSQL arasında JDBC / JNDI / Tomcat düzeyinde temel bir fark yoktur. Bununla birlikte, Oracle istemci / sunucu kurulum ayrıntıları söz konusu olduğunda Oracle PostgreSQL'den çok farklıdır. Orijinal soru / cevabın dış kapsamı. Denediklerinizin ayrıntılarını, belirli sürümleri ve hata mesajlarını içeren yeni bir soru göndermenizi öneririz. Örnek: stackoverflow.com/questions/10388137/…
kaliatech

52

Spring'in JavaConfig mekanizmasıyla, bunu şu şekilde yapabilirsiniz:

@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;
    }

}


21

Tomcat yapılandırmanızın içinde bir "sampleDS" veri kaynağı tanımına sahip olduğunuzu varsayarsak, applicationContext.xmlJNDI kullanarak veri kaynağına erişmek için aşağıdaki satırları ekleyebilirsiniz .

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

jeeÖnek için ad alanını ve şema konumunu aşağıdakileri kullanarak tanımlamanız gerekir :

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

Belgeler: C.2.3.1 <jee:jndi-lookup/>(basit)

Misal:

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

Sadece uygulamanızın veri kaynağına hangi JNDI adını bağladığını bulmanız gerekir. Bu tamamen sunucuya özgüdür, nasıl yapılacağını öğrenmek için sunucunuzdaki dokümanlara bakın.

C.2.3 Jee şemasındajee açıklandığı gibi, fasulye dosyanızın üst kısmındaki ad alanını bildirmeyi unutmayın .


8

Başka bir özellik: server.xml yerine, "uygulama"
/ META-INF / Context.xml ( tomcat belgelerine göre ) içine "Kaynak" etiketini şu şekilde ekleyebilirsiniz :

<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>

5

Göre Apache Tomcat 7 Jndi Veri kaynağı NASIL sayfa Web.xml bir kaynak yapılandırma olmalıdır:

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/TestDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>

Bu benim için çalışıyor


4

Bahar sınıfınızda, aşağıdaki gibi açıklamalı bir fasulye enjekte edebilirsiniz.

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

ve bunu context.xml dosyasına eklersiniz

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

Kullanarak tomcat's server.xml dosyasında JNDI kaynağını bildirebilirsiniz.

<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"/>

back to context.xml de spring bunu ekle

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

Bu örnek gibi, veritabanına bağlantı enjekte ediyorsanız, tomcat lib dizininde MySQL kavanozunun bulunduğundan emin olun, aksi takdirde tomcat MySQL veritabanı bağlantı havuzunu oluşturamaz.


1

Bu çözümü xml yapılandırmasını tamamen kaldırmak için temiz bir şekilde çok yararlı buldum.

Lütfen bu db yapılandırmasını JNDI ve yay çerçevesini kullanarak kontrol edin. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

Bu makalede, veritabanı jndi (db / test) yapılandırmasına dayalı bir db confguration oluşturmanın ne kadar kolay olduğunu açıklar. yapılandırmayı tamamladıktan sonra tüm db depoları bu jndi kullanılarak yüklenir. Yararlı buldum. @Pierre bununla ilgili bir sorun varsa bana bildirin. DB yapılandırması yazmak için tam çözüm.


Bu makalede, veritabanı jndi (db / test) yapılandırmasına dayalı bir db confguration oluşturmak ne kadar kolay açıklanır. yapılandırmayı tamamladıktan sonra tüm db depoları bu jndi kullanılarak yüklenir. Yararlı buldum. @Pierre bununla ilgili bir sorun varsa bana bildirin. DB yapılandırması yazmak için tam çözüm.
user3892286

Bu makalede, veritabanı jndi (db / test) yapılandırmasına dayalı bir db confguration oluşturmak ne kadar kolay açıklanır. yapılandırmayı tamamladıktan sonra tüm db depoları bu jndi kullanılarak yüklenir. Yararlı buldum. @Pierre bununla ilgili bir sorun varsa bana bildirin. DB yapılandırması yazmak için tam çözüm.
Sergio A.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.