source

server.xml 또는 context.xml에 데이터베이스 연결 속성을 설정해야 합니까?

topadmin 2023. 3. 11. 08:54

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

  1. 을 에 저장합니다.server.xml
  2. 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.xmlMETA-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.xmlJNDI!

스프링을 사용하여 콩밭에 위의 특성을 주입하기가 쉽습니다.

@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그 디르로.

다음 항목도 참조하십시오.

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