web-dev-qa-db-ja.com

server.xmlまたはcontext.xmlでデータベース接続プロパティを設定する必要があります

Spring WebアプリケーションのJNDIを使用してデータベース接続プロパティを設定しようとしています。

以下の2つのアプローチを検討しています。

アプローチ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:

このような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コンソールから設定する必要がありますか?

ありがとう!

77
user1016403

私はアプローチ2を好みます(すべてを設定します(設定の一部の属性だけでなく)。

ただし、グローバルserver.xmlまたはグローバルcontext.xmlに配置する代わりに、アプリケーション固有に配置する必要があります context.xml.default TomcatでYOUR_APP.xml

YOUR_APP.xmlファイルは$catalinaHome/conf/<engine>/<Host>にあります(たとえば、conf/Catalina/localhost/YOUR_APP.xml)。

アプリケーション固有のYOUR_APP.xmlの構成は、特定のアプリケーションでのみ使用可能です。

22
Ralph

アプローチ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は単純なキー値ファイルが好きです!

Springでは、上記のプロパティをBeanフィールドに簡単に注入できます。

@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.propertiesをそのディレクトリに配置します。

こちらもご覧ください:

9
gavenkoa

また、テスト、統合テスト、実稼働用のさまざまなアプリケーション構成に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" />

GitHubプロジェクト Tomcat JNDI URLサポート をチェックして、TomcatサーバーのJNDI URLサポートを有効にします。

0
Ben Asmussen

ステップ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();

すべてが設定されています

0
tamil arasan