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コンソールから設定する必要がありますか?
ありがとう!
私はアプローチ2を好みます(すべてを設定します(設定の一部の属性だけでなく)。
ただし、グローバルserver.xml
またはグローバルcontext.xml
に配置する代わりに、アプリケーション固有に配置する必要があります Tomcatでcontext.xml.default
YOUR_APP.xml
。
YOUR_APP.xml
ファイルは$catalinaHome/conf/<engine>/<Host>
にあります(たとえば、conf/Catalina/localhost/YOUR_APP.xml)。
アプリケーション固有のYOUR_APP.xml
の構成は、特定のアプリケーションでのみ使用可能です。
アプローチ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
をそのディレクトリに配置します。
こちらもご覧ください:
また、テスト、統合テスト、実稼働用のさまざまなアプリケーション構成に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サポートを有効にします。
ステップ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();
すべてが設定されています