Spring에서 Tomcat이 제공하는 JNDI DataSource를 사용하는 방법은 무엇입니까?


159

DriverManagerDataSource클래스 에 대한 Spring javadoc 기사 에서이 클래스는 매우 간단하고 권장된다고합니다.

컨테이너가 제공하는 JNDI DataSource를 사용합니다. 이러한 A DataSourceDataSourceSpring ApplicationContext에서 Bean 으로 노출 될 수 있습니다.JndiObjectFactoryBean

문제는 이 작업을 어떻게 수행합니까?

예를 들어, DataSource사용자 정의 MySQL 데이터베이스에 액세스 하기 위해 Bean을 가지려면 어떻게해야합니까? 컨텍스트 구성 등에 무엇을 써야합니까?

답변:


302

Spring의 XML 스키마 기반 구성을 사용하는 경우 다음과 같이 Spring 컨텍스트에서 설정하십시오.

<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 구성을 사용하여 설정하십시오.

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

Tomcat의 web context.xml에서 JNDI 리소스를 다음과 같이 참조하십시오.

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

참조 문서 :

편집 :이 답변은 Tomcat 8 및 Spring 4에 대해 업데이트되었습니다. Tomcat의 기본 데이터 소스 리소스 풀 설정에 대한 속성 이름이 약간 변경되었습니다 .


@skaffman 네,하지만 스프링 레퍼런스 문서에 대한 링크를 제공합니다.
Etienne Miret

"Tomcat 's web context.xml"은 정확히 무엇을 의미합니까?
Pavel Niedoba 2016 년

1
@PavelNiedoba Tomcat은 Tomcat 특정 웹 앱 구성에 "컨텍스트"를 사용합니다. 컨텍스트 파일 및 / 또는 컨텍스트 구성은 다양한 위치에 배치 될 수 있으므로 결정적인 답변을 드릴 수 없습니다. 일반적인 위치는 "/META-INF/context.xml"입니다. 여기 섹션 "컨텍스트를 정의"를 참조 tomcat.apache.org/tomcat-8.0-doc/config/...
kaliatech

음 ... 내 오라클 DB에서 작동하지 않는 것 같습니다. postgresql과의 차이점은 무엇입니까?
Phate

1
@Phate JDBC / JNDI / Tomcat 수준에서 Oracle과 PostgreSQL의 근본적인 차이점은 없습니다. 그러나 Oracle은 Oracle 클라이언트 / 서버 설정 세부 정보와 관련하여 PostgreSQL과 매우 다릅니다. 원래 질문 / 답변의 범위를 벗어남. 시도한 사항, 특정 버전 및 오류 메시지에 대한 세부 정보가 포함 된 새 질문을 게시하십시오. 예 : stackoverflow.com/questions/10388137/…
kaliatech

52

Spring의 JavaConfig 메커니즘을 사용하면 다음과 같이 할 수 있습니다.

@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
렌드의 절 Reinersdorff.

21

Tomcat 구성 내에 "sampleDS"데이터 소스 정의가 있다고 가정하면 applicationContext.xmlJNDI를 사용하여 데이터 소스에 액세스 하기 위해 다음 행을 추가 할 수 있습니다 .

<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 이름을 찾으면됩니다. 이것은 전적으로 서버마다 다르므로 서버의 문서를 참조하여 방법을 찾으십시오.

C.2.3 The jee schema에jee 설명 된대로 Bean 파일의 맨 위에 네임 스페이스 를 선언해야합니다 .


8

또 다른 기능 : server.xml 대신 다음과 같이
your_application / META-INF / Context.xml에 tomcat docs 에 따라 "Resource"태그를 추가 할 수 있습니다 .

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

그리고 이것을 context.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"/>

context.xml로 돌아가 봄

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

이 예와 같이 데이터베이스에 연결하는 경우 tomcat lib 디렉토리에 MySQL jar이 있는지 확인하십시오. 그렇지 않으면 tomcat이 MySQL 데이터베이스 연결 풀을 작성할 수 없습니다.


1

이 솔루션은 XML 구성을 완전히 제거하는 깔끔한 방법으로 매우 유용합니다.

JNDI 및 스프링 프레임 워크를 사용하여이 DB 구성을 확인하십시오. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

이 기사에서는 데이터베이스 jndi (db / test) 구성을 기반으로 DB 구성을 작성하는 방법에 대해 설명합니다. 구성이 완료되면이 jndi를 사용하여 모든 db 저장소가로드됩니다. 나는 유용하다고 생각했다. @Pierre에 문제가 있으면 알려주십시오. DB 구성을 작성하는 완벽한 솔루션입니다.


이 기사에서는 데이터베이스 jndi (db / test) 구성을 기반으로 DB 구성을 작성하는 방법에 대해 설명합니다. 구성이 완료되면이 jndi를 사용하여 모든 db 저장소가로드됩니다. 나는 유용하다고 생각했다. @Pierre에 문제가 있으면 알려주십시오. DB 구성을 작성하는 완벽한 솔루션입니다.
user3892286

이 기사에서는 데이터베이스 jndi (db / test) 구성을 기반으로 DB 구성을 작성하는 방법에 대해 설명합니다. 구성이 완료되면이 jndi를 사용하여 모든 db 저장소가로드됩니다. 나는 유용하다고 생각했다. @Pierre에 문제가 있으면 알려주십시오. DB 구성을 작성하는 완벽한 솔루션입니다.
Sergio A.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.