Spring에서 Tomcat이 제공하는 JNDI DataSource를 사용하는 방법은 무엇입니까?
DriverManagerDataSource
클래스 에 대한 Spring javadoc 기사 에서이 클래스는 매우 간단하고 권장된다고합니다.
컨테이너가 제공하는 JNDI DataSource를 사용합니다. 이러한 A
DataSource
는DataSource
Spring 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 JNDI 데이터 소스 하우투
- Tomcat 8 컨텍스트 리소스 링크 참조
- Spring 4 JEE JNDI 조회 XML 스키마 참조
- 봄 4 JndiObjectFactoryBean Javadoc
편집 :이 답변은 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.xml
JNDI를 사용하여 데이터 소스에 액세스 하기 위해 다음 행을 추가 할 수 있습니다 .
<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"
Documentation: C.2.3.1 <jee:jndi-lookup/>
(simple)
Example:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>
You just need to find out what JNDI name your appserver has bound the datasource to. This is entirely server-specific, consult the docs on your server to find out how.
Remember to declare the jee
namespace at the top of your beans file, as described in C.2.3 The jee schema.
Another feature: instead of of server.xml, you can add "Resource" tag in
your_application/META-INF/Context.xml (according to tomcat docs) like this:
<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>
According to Apache Tomcat 7 JNDI Datasource HOW-TO page there must be a resource configuration in 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>
That works for me
In your spring class, You can inject a bean annotated like as
@Autowired
@Qualifier("dbDataSource")
private DataSource dataSource;
and You add this in your context.xml
<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>
You can declare the JNDI resource in tomcat's server.xml using
<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 add this
<ResourceLink name="jdbc/MyLocalDB"
global="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource" />
if, like this exmple you are injecting connection to database, make sure that MySQL jar is present in the tomcat lib directory, otherwise tomcat will not be able to create the MySQL database connection pool.
I found this solution very helpful in a clean way to remove xml configuration entirely.
Please check this db configuration using JNDI and spring framework. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/
By this article, it explain how easy to create a db confguration based on database jndi(db/test) configuration. once you are done with configuration then all the db repositories are loaded using this jndi. I did find useful. If @Pierre has issue with this then let me know. It's complete solution to write db configuration.
참고URL : https://stackoverflow.com/questions/9183321/how-to-use-jndi-datasource-provided-by-tomcat-in-spring
'Programing' 카테고리의 다른 글
팬더 데이터 프레임의 열을 반복하여 회귀를 실행하는 방법 (0) | 2020.06.09 |
---|---|
왜 파이썬 3에서 부동 소수점 값 4 * 0.1이 멋지게 보이지만 3 * 0.1은 그렇지 않습니까? (0) | 2020.06.09 |
노드 : 콘솔 대신 파일에 로그인 (0) | 2020.06.09 |
힘내 하위 모듈 추가 : "git 디렉토리가 로컬에서 발견되었습니다"문제 (0) | 2020.06.09 |
PowerShell에서 MD5 체크섬을 얻는 방법 (0) | 2020.06.09 |