[SPRING] server.xml 또는 context.xml에 데이터베이스 연결 속성을 설정해야합니까?
SPRINGserver.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과 접근법 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를 선호한다. (모든 것을 넣을 수있다.
글로벌 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.접근법 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.테스트, 통합 테스트, 프로덕션을위한 다양한 애플리케이션 구성에 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.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();
모든 것이 설정됩니다.
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
'SPRING' 카테고리의 다른 글
[SPRING] Spring-MVC : "컨텍스트"와 "네임 스페이스"란 무엇입니까? (0) | 2018.12.21 |
---|---|
[SPRING] Spring MVC : <context : component-scan>과 <annotation-driven /> 태그의 차이점은 무엇입니까? [복제] (0) | 2018.12.21 |
[SPRING] 런타임시 Spring bean 정의를 대체 할 수 있습니까? (0) | 2018.12.21 |
[SPRING] 봄 부팅 기본 H2 JDBC 연결 (및 H2 콘솔) (0) | 2018.12.21 |
[SPRING] Spring MVC 애플리케이션에서 Swagger를 구현하는 '간단한'방법 (0) | 2018.12.21 |