82

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 コンソールから構成する必要がありますか?

ありがとう!

4

5 に答える 5

23

YOUR_APP.xmlファイル

私はアプローチ 2 を好みます (構成内の一部の属性だけでなく、すべてを配置しますが、それらをグローバルserver.xmlまたはグローバルに配置する代わりに、Tomcatcontext.xmlのアプリケーション固有のファイルに配置する必要があります。context.xml.default YOUR_APP.xml

YOUR_APP.xmlファイルは次の場所にあります$catalinaHome/conf/<engine>/<host>(例: conf/Catalina/localhost/YOUR_APP.xml)。

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

MuleSoft が発行するガイドを参照してください。また、公式ドキュメントTomcat Configuration Referenceの The Context Container のページを参照してください。

そのドキュメントを引用するには:

個々の Context 要素を明示的に定義できます。

• …</p>

$CATALINA_BASE/conf/[enginename]/[hostname]/•ディレクトリ内の個々のファイル (「.xml」拡張子付き) 。コンテキスト パスとバージョンは、ファイルのベース名 (.xml 拡張子を除いたファイル名) から派生します。

• …</p>

于 2013-02-25T11:21:18.710 に答える
10

アプローチ 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}}'/>

ファイルを外部化するには、 org.apache.catalina.loader.VirtualWebappLoader.propertiesを持つ最新の Tomcat 7 を使用します。

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

したがって、devopsvirtualClasspathは、アプリケーションごとに個別のローカル外部フル パスで埋められapp.properties、そのディレクトリにローカルに配置されます。

以下も参照してください。

于 2014-10-01T16:48:59.607 に答える