SpringでTomcatによって提供されるJNDI DataSourceを使用する方法


159

DriverManagerDataSourceクラスに関するSpring javadocの記事では、このクラスは非常にシンプルであり、推奨されていると言われています

コンテナが提供するJNDI DataSourceを使用する。このようなは、Spring ApplicationContextでBean DataSourceとして公開できます。DataSourceJndiObjectFactoryBean

問題は、これをどのように達成するかです。

たとえばDataSource、カスタムMySQLデータベースにアクセスするためのBeanが必要な場合、何が必要ですか?コンテキスト設定などに何を書けばよいですか?

回答:


302

SpringのXMLスキーマベースの構成を使用する場合は、次のようにSpringコンテキストで設定します。

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
...
<jee:jndi-lookup id="dbDataSource"
   jndi-name="jdbc/DatabaseName"
   expected-type="javax.sql.DataSource" />

または、次のような単純なBean構成を使用してセットアップします。

<bean id="DatabaseName" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/DatabaseName"/>
</bean>

次のようなものを使用して、Tomcatのserver.xmlでJNDIリソースを宣言できます。

<GlobalNamingResources>
    <Resource name="jdbc/DatabaseName"
              auth="Container"
              type="javax.sql.DataSource"
              username="dbUser"
              password="dbPassword"
              url="jdbc:postgresql://localhost/dbname"
              driverClassName="org.postgresql.Driver"
              initialSize="20"
              maxWaitMillis="15000"
              maxTotal="75"
              maxIdle="20"
              maxAge="7200000"
              testOnBorrow="true"
              validationQuery="select 1"
              />
</GlobalNamingResources>

次のように、TomcatのWeb context.xmlからJNDIリソースを参照します。

  <ResourceLink name="jdbc/DatabaseName"
   global="jdbc/DatabaseName"
   type="javax.sql.DataSource"/>

リファレンスドキュメント:

編集:この回答は、Tomcat 8およびSpring 4で更新されました。Tomcatのデフォルトのデータソースリソースプールの設定で、プロパティ名がいくつか変更されました。


@skaffmanはい。ただし、Springリファレンスドキュメントへのリンクを提供します。
Etienne Miret、2013

「Tomcatのweb context.xml」で正確にどのファイルを意味しますか?
Pavel Niedoba

1
@PavelNiedoba Tomcatは、Tomcat固有のWebアプリ構成に「コンテキスト」を使用します。コンテキストファイルやコンテキスト構成はさまざまな場所に配置できるため、明確な回答はできません。一般的な場所は「/META-INF/context.xml」です。:ここでの「コンテキストの定義」を参照してくださいtomcat.apache.org/tomcat-8.0-doc/config/...
kaliatech

うーん...私のOracleデータベースでは機能していないようです、postgresqlとの違いはありますか?
2015

1
@Phate JDBC / JNDI / TomcatレベルでのOracleとPostgreSQLの基本的な違いはありません。ただし、Oracleクライアント/サーバーのセットアップの詳細に関しては、OracleはPostgreSQLとは大きく異なります。元の質問/回答の範囲外。試した内容の詳細、特定のバージョン、およびエラーメッセージとともに新しい質問を投稿することを提案します。例:stackoverflow.com/questions/10388137/...
kaliatech

52

SpringのJavaConfigメカニズムを使用すると、次のように実行できます。

@Configuration
public class MainConfig {

    ...

    @Bean
    DataSource dataSource() {
        DataSource dataSource = null;
        JndiTemplate jndi = new JndiTemplate();
        try {
            dataSource = jndi.lookup("java:comp/env/jdbc/yourname", DataSource.class);
        } catch (NamingException e) {
            logger.error("NamingException for java:comp/env/jdbc/yourname", e);
        }
        return dataSource;
    }

}


21

tomcat構成内に「sampleDS」データソース定義があると想定すると、以下の行をに追加applicationContext.xmlして、JNDIを使用してデータソースにアクセスできます。

<jee:jndi-lookup expected-type="javax.sql.DataSource" id="springBeanIdForSampleDS" jndi-name="sampleDS"/>

jeeを使用して、プレフィックスの名前空間とスキーマの場所を定義する必要があります。

xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"

15

ドキュメント:C.2.3.1 <jee:jndi-lookup/>(シンプル)

例:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>

アプリサーバーがデータソースにバインドしているJNDI名を見つけるだけです。これは完全にサーバー固有のものです。方法については、サーバーのドキュメントを参照してください。

C.2.3 jeeスキーマでjee説明されているように、beansファイルの先頭で名前空間を宣言することを忘れないでください。


8

別の機能:server.xmlの代わりに、「Resource」タグを
your_application / META-INF / Context.xml(tomcat docsによると)に次のように追加できます。

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


4

あなたの春のクラスでは、次のように注釈が付けられた豆を注入することができます

@Autowired
@Qualifier("dbDataSource")
private DataSource dataSource;

そしてあなたはあなたのcontext.xmlにこれを追加します

<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>

以下を使用して、Tomcatのserver.xmlでJNDIリソースを宣言できます。

<Resource name="jdbc/TestDB" 
  global="jdbc/TestDB" 
  auth="Container" 
  type="javax.sql.DataSource" 
  driverClassName="com.mysql.jdbc.Driver" 
  url="jdbc:mysql://localhost:3306/TestDB" 
  username="pankaj" 
  password="pankaj123" 

  maxActive="100" 
  maxIdle="20" 
  minIdle="5" 
  maxWait="10000"/>

春にcontext.xmlに戻ってこれを追加してください

<ResourceLink name="jdbc/MyLocalDB"
                global="jdbc/TestDB"
                auth="Container"
                type="javax.sql.DataSource" />

この例のようにデータベースへの接続を注入する場合は、MySQL jarがtomcat libディレクトリにあることを確認してください。そうでない場合、tomcatはMySQLデータベース接続プールを作成できません。


1

このソリューションは、XML構成を完全に削除するクリーンな方法で非常に役立つことがわかりました。

JNDIとSpring Frameworkを使用して、このDB構成を確認してください。 http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

この記事では、データベースjndi(db / test)構成に基づいてdb構成を作成するのがいかに簡単かを説明します。設定が完了すると、このjndiを使用してすべてのデータベースリポジトリがロードされます。役に立つと思いました。@Pierreに問題がある場合は、お知らせください。これは、DB構成を書き込むための完全なソリューションです。


この記事では、データベースjndi(db / test)構成に基づいてdb構成を作成するのがいかに簡単かを説明します。構成が完了すると、すべてのデータベースリポジトリがこのjndiを使用してロードされます。役に立つと思いました。@Pierreに問題がある場合は、お知らせください。これは、DB構成を書き込むための完全なソリューションです。
user3892286 2017

この記事では、データベースjndi(db / test)構成に基づいてdb構成を作成するのがいかに簡単かを説明します。構成が完了すると、すべてのデータベースリポジトリがこのjndiを使用してロードされます。役に立つと思いました。@Pierreに問題がある場合は、お知らせください。これは、DB構成を書き込むための完全なソリューションです。
セルジオA.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.