저는 user1016403이 설명하는 접근법 1 과 접근법 2 에서 가장 좋은 세 번째 접근법을 선호합니다
.
접근 3
- 데이터베이스 속성을
server.xml
server.xml
웹 애플리케이션에서 데이터베이스 속성 참조META-INF/context.xml
접근 방식 3 가지 이점
첫 번째 지점은 보안상의 이유로 유용하지만 두 번째 지점은 서버 속성 값이 변경 되더라도 웹 응용 프로그램에서 서버 속성 값을 참조하는 데 유용합니다.
또한 서버의 리소스 정의를 웹 응용 프로그램에서 사용하는 것과 분리하면 서로 다른 팀이 서로 다른 계층 / 계층에서 작업하는 다양한 복잡성으로 조직 전체에서 이러한 구성을 확장 할 수 있습니다. 관리자가 동일한 것을 공유하는 경우 서버 관리자 팀은 개발자 팀과 충돌하지 않고 작업 할 수 있습니다. 각 자원에 대한 개발자와 함께 JNDI 이름.
접근 방식 3 구현
JNDI 이름을 정의하십시오 jdbc/ApplicationContext_DatabaseName
.
다음과 같은 것을 사용하여 jdbc/ApplicationContext_DatabaseName
Tomcat에서의 다양한 속성과 값을 선언하십시오 server.xml
.
<GlobalNamingResources>
<Resource name="jdbc/ApplicationContext_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"/>
</GlobalNamingResources/>
링크 jdbc/ApplicationContext_DatabaseName
웹 응용 프로그램에서의 특성을 META-INF/context.xml
응용 프로그램 - 개인 JNDI 컨텍스트에 의해 java:comp/env/
에 지정된 name
속성 :
<Context path="/ApplicationContext" ... >
<!--
"global" attribute links to GlobalNamingResources in the ${catalina.base}/conf/server.xml (server administrator team)
"name" attribute is relative to the application-private JNDI context java:comp/env/ and is looked up from the java web application (application developer team)
-->
<ResourceLink global="jdbc/ApplicationContext_DatabaseName" name="jdbc/DatabaseName" type="javax.sql.DataSource"/>
</Context>
마지막으로 JNDI 리소스를 사용하려면 jdbc/DatabaseName
웹 애플리케이션의 배포 설명자에 JNDI 이름 을 지정합니다 .
<resource-ref>
<description>DatabaseName's Datasource</description>
<res-ref-name>jdbc/DatabaseName</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
그리고 Spring 컨텍스트에서 :
<jee:jndi-lookup id="DatabaseNameDataSource"
jndi-name="jdbc/DatabaseName"
expected-type="javax.sql.DataSource" />
3 가지 단점 접근
JNDI 이름이 변경되면 server.xml
및 을 모두 META-INF/context.xml
편집해야하며 배포가 필요합니다. 그럼에도 불구하고이 시나리오는 드뭅니다.
3 가지 변형에 접근
하나의 웹 애플리케이션에서 사용하는 많은 데이터 소스
Tomcat에 구성을 추가하기 만하면됩니다 server.xml
.
<GlobalNamingResources>
<Resource name="jdbc/ApplicationContext_DatabaseName1" ... />
<Resource name="jdbc/ApplicationContext_DatabaseName2" ... />
...
</GlobalNamingResources/>
속성에 지정된 META-INF/context.xml
응용 프로그램 개인 JNDI 컨텍스트로 링크 웹 응용 프로그램 을 추가 합니다.java:comp/env/
name
<Context path="/ApplicationContext" ... >
<ResourceLink global="jdbc/ApplicationContext_DatabaseName1" name="jdbc/DatabaseName1" ... />
<ResourceLink global="jdbc/ApplicationContext_DatabaseName2" name="jdbc/DatabaseName2" ... />
...
</Context>
마지막으로 웹 애플리케이션의 배포 설명자에 JNDI 리소스 사용량을 추가합니다.
<resource-ref>
<description>DatabaseName1's Datasource</description>
<res-ref-name>jdbc/DatabaseName1</res-ref-name> ...
</resource-ref>
<resource-ref>
<description>DatabaseName2's Datasource</description>
<res-ref-name>jdbc/DatabaseName2</res-ref-name> ...
</resource-ref>
...
그리고 Spring 컨텍스트에서 :
<jee:jndi-lookup id="DatabaseName1DataSource"
jndi-name="jdbc/DatabaseName1" ... />
<jee:jndi-lookup id="DatabaseName2DataSource"
jndi-name="jdbc/DatabaseName2" ... />
...
동일한 서버의 많은 웹 응용 프로그램에서 사용하는 많은 데이터 소스
Tomcat에 구성을 추가하기 만하면됩니다 server.xml
.
<GlobalNamingResources>
<Resource name="jdbc/ApplicationContextX_DatabaseName1" ... />
<Resource name="jdbc/ApplicationContextX_DatabaseName2" ... />
<Resource name="jdbc/ApplicationContextY_DatabaseName1" ... />
<Resource name="jdbc/ApplicationContextY_DatabaseName2" ... />
...
</GlobalNamingResources/>
다른 구성은 이전 변형 사례에서 추론 할 수 있어야합니다.
동일한 서버의 많은 웹 애플리케이션에서 사용되는 동일한 데이터베이스에 대한 많은 데이터 소스
이 경우 Tomcat의 server.xml
구성은 다음과 같습니다.
<GlobalNamingResources>
<Resource name="jdbc/ApplicationContextX_DatabaseName" ... />
<Resource name="jdbc/ApplicationContextY_DatabaseName" ... />
다음 META-INF/context.xml
과 같은 두 가지 웹 응용 프로그램에서 끝납니다 .
<Context path="/ApplicationContextX" ... >
<ResourceLink global="jdbc/ApplicationContextX_DatabaseName" name="jdbc/DatabaseName" ... />
</Context>
그리고 좋아 :
<Context path="/ApplicationContextY" ... >
<ResourceLink global="jdbc/ApplicationContextY_DatabaseName" name="jdbc/DatabaseName" ... />
</Context>
누군가가 같은이 사실에 대해 걱정 될 수 있도록 name="jdbc/DatabaseName"
같은 서버에 배치 된 두 개의 서로 다른 응용 프로그램에서, 고개를 한 후 사용하십시오이 있기 때문에 문제가되지 않습니다 jdbc/DatabaseName
응용 프로그램 - 개인 JNDI 컨텍스트입니다 java:comp/env/
때문에, ApplicationContextX
사용java:comp/env/
할 수 없습니다 (설계 상)에 링크 된 리소스를 찾습니다 global="jdbc/ApplicationContextY_DatabaseName"
.
물론 이러한 걱정없이 더 편안하게 느껴진다면 다음과 같은 다른 이름 지정 전략을 사용할 수 있습니다.
<Context path="/ApplicationContextX" ... >
<ResourceLink global="jdbc/ApplicationContextX_DatabaseName" name="jdbc/applicationXprivateDatabaseName" ... />
</Context>
그리고 좋아 :
<Context path="/ApplicationContextY" ... >
<ResourceLink global="jdbc/ApplicationContextY_DatabaseName" name="jdbc/applicationYprivateDatabaseName" ... />
</Context>
<Resource name="jdbc/ApplicationContextX_DatabaseName" ... /> <Resource name="jdbc/ApplicationContextY_DatabaseName" ... />
리소스가 연결 풀인 경우 웹 응용 프로그램 당 하나씩 두 개의 개별 풀이 제공됩니까? 반면에 두 웹앱에서 하나의 리소스로 연결하면 연결 풀이 하나만있을 것입니다. 맞습니까? 하나를 선호하는 이유가 있습니까? (웹 앱당 하나의 개별 DB 연결 풀과 모든 웹앱에서 공유하는 하나의 연결 풀)? 감사.