복붙노트

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

SPRING

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

스프링 웹 애플리케이션에 JNDI를 사용하여 데이터베이스 연결 속성을 설정하려고합니다.

아래 두 가지 접근 방식을 고려하고 있습니다.

접근법 1 :

Spring 설정에서 다음과 같은 것을 가질 수 있습니다 :

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

다음과 같이 스프링 컨텍스트에서 설정 :

<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 개인 경우 두 개의 구성을 사용해야합니까?

또한 직접 server.xml 또는 context.xml에 배치하는 것이 가장 좋습니다. 아니면 Tomcat Manager GUI 콘솔을 통해 구성해야합니까?

감사!

해결법

  1. ==============================

    1.나는 세 번째 접근법을 선호한다. 접근법 1과 접근법 2는 user1016403에 기술되어있다.

    나는 세 번째 접근법을 선호한다. 접근법 1과 접근법 2는 user1016403에 기술되어있다.

    첫 번째 요점은 보안상의 이유로 유용하지만 두 번째 요점은 서버 속성 값이 변경 되더라도 웹 응용 프로그램의 서버 속성 값을 참조하는 데 유용합니다.

    또한 서버에서 자원 정의를 웹 응용 프로그램에서 사용하지 못하도록하면 여러 팀이 서로 다른 계층 / 계층에서 작업 할 때 복잡성이있는 조직 전체에서 이러한 구성을 확장 할 수 있습니다. 서버 관리자 팀은 관리자가 동일한 경우 개발자 팀과 충돌하지 않고 작업 할 수 있습니다 각 자원에 대한 개발자와 JNDI 이름.

    JNDI 이름 jdbc / ApplicationContext_DatabaseName을 정의하십시오.

    Tomcat의 server.xml에서 jdbc / ApplicationContext_DatabaseName의 다양한 속성과 값을 다음과 같이 선언하십시오.

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

    name 속성에 지정된 응용 프로그램 비공개 JNDI 컨텍스트 java : comp / env /에 의해 웹 응용 프로그램 META-INF / context.xml의 jdbc / ApplicationContext_DatabaseName 속성을 연결합니다.

    <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 리소스를 사용하려면 웹 응용 프로그램의 배포 설명자에 JNDI 이름 jdbc / DatabaseName을 지정합니다.

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

    JNDI 이름이 변경되면 server.xml과 META-INF / context.xml을 모두 편집해야하며 배포가 필요합니다. 그럼에도 불구하고이 시나리오는 드물다.

    하나의 웹 응용 프로그램에서 사용하는 많은 데이터 소스

    Tomcat의 server.xml에 구성을 추가하기 만하면됩니다.

    <GlobalNamingResources>
      <Resource name="jdbc/ApplicationContext_DatabaseName1" ... />
      <Resource name="jdbc/ApplicationContext_DatabaseName2" ... />
      ...
    </GlobalNamingResources/>
    

    응용 프로그램 비공개 JNDI 컨텍스트에 의해 링크 웹 응용 프로그램 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>
    ...
    

    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>
    

    누군가는 같은 이름 = "jdbc / DatabaseName"이 조회되어 동일한 서버에 전개 된 두 개의 서로 다른 응용 프로그램에 의해 사용된다는 사실에 대해 걱정할 수도 있습니다. 이는 jdbc / DatabaseName이 응용 프로그램에 따라 다르므로 문제가되지 않습니다. 개인 JNDI 컨텍스트 java : comp / env /이므로 java : comp / env /를 사용하여 ApplicationContextX는 (의도적으로) 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>
    
  2. ==============================

    2.나는 접근법 2를 선호한다. (모든 것을 넣을 수있다.

    나는 접근법 2를 선호한다. (모든 것을 넣을 수있다.

    글로벌 server.xml 또는 global context.xml에 배치하는 대신 tomcat의 application context.xml.default YOUR_APP.xml에 배치해야합니다.

    YOUR_APP.xml 파일은 $ catalinaHome / conf / / 에 있습니다 (예 : conf / Catalina / localhost / YOUR_APP.xml).

    응용 프로그램 특정 YOUR_APP.xml의 구성은 특정 응용 프로그램에서만 사용 가능합니다.

  3. ==============================

    3.접근법 4

    접근법 4

    JNDI를 사용하는 대신 구성 타임에 .properties 파일을 사용하고 프로그램 초기화 중에 복잡한 객체를 작성합니다.

    이미 Spring을 사용하고 있으며 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>
    

    나는 Ralph와 $ 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.VirtualWebappLoader가있는 현대 Tomcat 7을 사용합니다.

    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
            virtualClasspath="/srv/web/app/"/>
    

    따라서 devops는 virtualClasspath를 응용 프로그램별로 별도의 로컬 외부 전체 경로로 채우고 해당 app.propertiesto를 해당 디렉토리에 배치합니다.

    참조 :

  4. ==============================

    4.테스트, 통합 테스트, 프로덕션을위한 다양한 애플리케이션 구성에 JNDI URL 지원을 사용할 수도 있습니다.

    테스트, 통합 테스트, 프로덕션을위한 다양한 애플리케이션 구성에 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 지원을 확인하십시오.

  5. ==============================

    5.1 단계 : context.xml

    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();
    

    모든 것이 설정됩니다.

  6. from https://stackoverflow.com/questions/15064260/should-you-set-up-database-connection-properties-in-server-xml-or-context-xml by cc-by-sa and MIT license