Spring에서 Tomcat이 제공하는 JNDI DataSource를 사용하는 방법은 무엇입니까? Spring javadoc 기사 에서이 클래스는 매우

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

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

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

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



답변

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의 기본 데이터 소스 리소스 풀 설정에 대한 속성 이름이 약간 변경되었습니다 .


답변

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

}

답변

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"

답변

설명서 : 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 파일의 맨 위에 네임 스페이스 를 선언해야합니다 .


답변

또 다른 기능 : 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>

답변

Apache Tomcat 7 JNDI Datasource HOW-TO 페이지 에 따르면 web.xml에 자원 구성이 있어야합니다.

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

그것은 나를 위해 작동


답변

봄 학급에서는 다음과 같이 주석이 달린 콩을 주입 할 수 있습니다

@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 데이터베이스 연결 풀을 작성할 수 없습니다.