web-dev-qa-db-ja.com

Tomcatが提供するJNDI DataSourceをSpringで使用するにはどうすればいいですか?

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

コンテナによって提供されるJNDIデータソースを使用します。そのようなDataSourceは、DataSourceを介してSpring ApplicationContext内でJndiObjectFactoryBean Beanとして公開できます。

問題は次のとおりです。どのようにしてこれを達成できますか?

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

150
Suzan Cioc

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のデフォルトのデータソースリソースプール設定のためにいくつかのプロパティ名の変更がありました。

295
kaliatech

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;
    }

}
48
Abdull

Tomcat設定内に "sampleDS"データソース定義があると仮定すると、JNDIを使用してデータソースにアクセスするために次の行をapplicationContext.xmlに追加できます。

<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"
20
melihcelik

ドキュメント: C.2.3.1 <jee:jndi-lookup/>(単純)

例:

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

あなたのアプリケーションサーバーがどのJNDI名でデータソースをバインドしているかを知る必要があります。これは完全にサーバー固有のものです。方法については、サーバー上のドキュメントを参照してください。

C.2.3 jeeスキーマ で説明されているように、必ずBeanファイルの先頭にjeeネームスペースを宣言してください。

15
skaffman

もう1つの機能: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>
8
Evgen

Apache Tomcat 7 JNDIデータソースHOW-TOページ によると、web.xmlにはリソース設定が必要です。

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/TestDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>

それは私のために働く

5
Antonio

私はxmlの設定を完全に削除するためのクリーンな方法でこの解決策が非常に役立つことを見つけました。

JNDIとスプリングフレームワークを使用してこのデータベース設定を確認してください。 http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

この記事では、データベースjndi(db/test)の設定に基づいてdb設定を作成する方法を簡単に説明します。設定が完了したら、このjndiを使用してすべてのdbリポジトリがロードされます。私は役に立ちましたか。 @Pierreがこれに問題を抱えているなら、私に知らせてください。それはdb設定を書くための完全な解決策です。

2
user3892286

あなたのスプリングクラスでは、次のようにアノテーションを付けたbeanを注入することができます。

@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データベース接続プールを作成できません。

2
Toumi