server.xml 또는 context.xml에 데이터베이스 연결 속성을 설정해야 합니까?
Spring 웹 어플리케이션용 JNDI를 사용하여 데이터베이스 연결 속성을 설정하려고 합니다.
저는 다음과 같은 두 가지 접근방식을 고려하고 있습니다.
접근법 1:
스프링 구성에는 다음과 같은 것이 있습니다.
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/facs"/>
그런 다음 webapp /META-INF/context.xml 파일에도 다음과 같은 내용이 있어야 합니다.
<?xml version='1.0' encoding='utf-8'?>
<!-- antiResourceLocking="true" -->
<Context path="/podd-apn"
reloadable="true"
cachingAllowed="false"
antiResourceLocking="true"
>
<Resource name="jdbc/facs"
type="javax.sql.DataSource" username="${database.username}" password="${database.password}"
driverClassName="org.postgresql.Driver"
url="${database.url}"
maxActive="8" maxIdle="4"
global="jdbc/facs"
/>
</Context>
web.xml에서는 다음과 같이 해야 합니다.
<!-- JNDI -->
<resource-ref>
<description>FACs Datasource</description>
<res-ref-name>jdbc/facs</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
접근법 2:
Spring 컨텍스트에서 다음과 같이 설정합니다.
<jee:jndi-lookup id="dbDataSource"
jndi-name="jdbc/DatabaseName"
expected-type="javax.sql.DataSource" />
다음과 같은 방법으로 Tomcat의 server.xml에서 JNDI 리소스를 선언할 수 있습니다.
<GlobalNamingResources>
<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"/>
</GlobalNamingResources/>
Tomcat의 web context.xml에서 다음과 같이 JNDI 리소스를 참조합니다.
<ResourceLink name="jdbc/DatabaseName"
global="jdbc/DatabaseName"
type="javax.sql.DataSource"/>
데이터베이스 속성을 보관하기에 가장 좋은 장소는 어디입니까?server.xml 또는 context.xml 중 어느 쪽에 배치해야 합니까?
또, 2개의 데이터베이스가 있는 경우는, 2개의 설정을 사용할 필요가 있습니까.
또한 server.xml 또는 context.xml 중 하나에 직접 배치하는 것이 베스트 프랙티스입니까?또는 Tomcat Manager GUI 콘솔을 사용하여 설정해야 합니까?
감사합니다!
사용자 1016403이 설명한 접근법1과 접근법2를 최대한 활용하는 세 번째 접근방식을 선호합니다.
어프로치 3
- 을 에 저장합니다.
server.xml
-
server.xml
어플리케이션으로부터의META-INF/context.xml
어프로치 3의 이점
첫 번째 포인트는 보안상의 이유로 유용하지만 두 번째 포인트는 서버 속성 값이 변경되더라도 웹 응용 프로그램에서 서버 속성 값을 참조할 때 유용합니다.
또, 서버상의 자원 정의와 Web 애플리케이션의 사용을 분리하는 것으로, 이러한 구성을 조직 전체에 걸쳐 확장할 수 있게 됩니다.다양한 계층/레이어상에서 다른 팀이 작업하는 경우, 서버 관리자 팀은 같은 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
개인 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
기술자: "Deployment " " 입니다.
<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>
그리고 봄의 맥락에서:
<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
개인 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>
...
그리고 봄의 맥락에서:
<jee:jndi-lookup id="DatabaseName1DataSource"
jndi-name="jdbc/DatabaseName1" ... />
<jee:jndi-lookup id="DatabaseName2DataSource"
jndi-name="jdbc/DatabaseName2" ... />
...
같은 서버상의 많은 웹 어플리케이션에서 사용되는 많은 데이터 소스
만 하면 됩니다.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"
는 같은되어 사용됩니다가 되지 않습니다.이것은, 「2」의 「2」의 「2」의」이기 때문입니다.이것은 문제가 되지 않습니다.jdbc/DatabaseName
는 응용 프로그램 입니다.java:comp/env/
, (그래서)ApplicationContextX
Cannot(설계상)을 사용하여 링크된 리소스를 조회할 수 없습니다.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>
YOUR_APP.xml
2의 어트리뷰트 어프로치 에, 어프로치 2(설정내의 어트리뷰트)를 사용하는 것이 .server.xml
글로벌 "" " " " " " "context.xml
응용 프로그램 고유의 위치에 배치해야 합니다.
context.xml.default
YOUR_APP.xml
파일을 저장합니다.
YOUR_APP.xml
, 라고 되어 있습니다.$catalinaHome/conf/<engine>/<host>
:conf/Catalina/localhost/YOUR_APP.xml
를 참조해 주세요.
고유의 .YOUR_APP.xml
는 특정 어플리케이션에서만 사용할 수 있습니다.
Mull Soft에서 발행한 가이드를 참조하십시오.또한 Context Container 공식 문서인 Tomcat Configuration Reference 페이지를 참조하십시오.
이 문서를 인용하려면:
개개의 컨텍스트 요소를 명시적으로 정의할 수 있습니다.
• …
의의 파일「.
$CATALINA_BASE/conf/[enginename]/[hostname]/
디렉토리로 이동합니다.컨텍스트 경로 및 버전은 파일의 기본 이름(파일 이름에서 .xml 확장자를 뺀 값)에서 파생됩니다.• …
어프로치 4
JNDI를 사용하는 대신.properties
프로그램 초기화 중에 복잡한 오브젝트를 파일화하여 빌드할 수 있습니다.
당신은 이미 스프링을 사용하고 있고 그것은 쉬운 구조이다.DataSource
기준:
<context:property-placeholder location="classpath:app.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@${db.host}:${db.port}:${db.user}"/>
<property name="username" value="${db.user}"/>
<property name="password" value="${db.pass}"/>
</bean>
랄프 님의 도입 기술자 사용에 전적으로 동의합니다.$CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml
JNDI!
스프링을 사용하여 콩밭에 위의 특성을 주입하기가 쉽습니다.
@Value("${db.user}") String defaultSchema;
JNDI 대신:
@Inject ApplicationContext context;
Enviroment env = context.getEnvironment();
String defaultSchema = env.getProperty("db.user");
또, EL 에서는 다음의 조작이 가능합니다(디폴트치 및 딥 재귀 치환).
@Value('${db.user:testdb}') private String dbUserName;
<property name='username' value='${db.user.${env}}'/>
.properties
파일 org.apache.catalina.loader가 있는 최신 Tomcat 7을 사용합니다.Virtual Webapp Loader:
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="/srv/web/app/"/>
당신의 가 채워집니다.virtualClasspath
풀이 패스는 풀 패스를 넣습니다.app.properties
그 디르로.
다음 항목도 참조하십시오.
- Tomcat 클래스 경로에 디렉터리 추가
- Tomcat에서 응용 프로그램별로 커스텀클래스 경로를 만들 수 있습니까?
- .war 파일에서 Tomcat webapp 구성 외부화
- Tomcat에서 웹 앱 컨텍스트 외부에서 속성 파일을 읽는 방법
- 속성 파일을 사용하여 DB 연결 정보를 로드하도록 Tomcat 구성
- Tomcat 구성 외부화
스텝 1: context.xml
<Context path="/projectname">
<Resource auth="Container"
driverClassName="com.mysql.jdbc.Driver"
logAbandoned="true"
maxActive="100" ``
maxIdle="30"
maxWait="10000"
name="refname"
removeAbandoned="true"
removeAbandonedTimeout="60"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost:8080/dbname"
username="root"
password="root"/>
</Context>
스텝 2 : web.xml
<resource-ref>
<description>DB Connection</description>
<res-ref-name>refname</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
스텝 3 : 접속할 클래스 만들기
Connection connection = null;
Context context = (Context) new InitialContext().lookup("java:comp/env");
DataSource ds = (DataSource) context.lookup("refname");
connection = ds.getConnection();
모든 것이 준비되었다
테스트, 통합 테스트, 실가동 환경에 따라 다른 응용 프로그램 구성에 JNDI URL 지원을 사용할 수도 있습니다.
<Context>
...
<Resource auth="Container" factory="com.benasmussen.jndi.url.URLFactory"
name="url/MyUrl" type="java.net.URL" url="file:///your/path/to/file"/>
...
</Context>
<jee:jndi-lookup id="myUrl" jndi-name="java:comp/env/url/MyUrl" expected-type="java.net.URL" />
Tomcat 서버의 JNDI URL 지원을 활성화하려면 GitHub 프로젝트 Tomcat JNDI URL 지원을 확인하십시오.
언급URL : https://stackoverflow.com/questions/15064260/should-you-set-up-database-connection-properties-in-server-xml-or-context-xml
'source' 카테고리의 다른 글
LinkedHashMap을 커스텀 Java 객체로 변환하는 방법 (0) | 2023.03.11 |
---|---|
잭슨 또는 지슨과의 Jsonpath (0) | 2023.03.11 |
반응 상수 생성 파일 (0) | 2023.03.11 |
WooCommerce 4+에서 가변 가격대를 선택한 변동 가격으로 대체하십시오. (0) | 2023.03.11 |
url에서 프로그램 방식으로 피처링 이미지를 설정하려면 어떻게 해야 합니까? (0) | 2023.03.11 |