web-dev-qa-db-ja.com

persistence.xmlとSpring構成ファイルでのデータソースの構成の違い

私は2つの方法でデータソース構成を確認(および実行)しました(以下のコードはデモ用です)。

1)永続化ユニット内の構成:

<persistence-unit name="LocalDB" transaction-type="RESOURCE_LOCAL">
    <class>domain.User</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
        <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.c3p0.min_size" value="5"/>
        ....
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>
</persistence-unit>

2)Spring構成ファイル内の構成(applicationContext.xmlなど):

<bean id="domainEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="JiraManager"/>
    <property name="dataSource" ref="domainDataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false"/>
            <property name="showSql" value="false"/>
            <property name="databasePlatform" value="${hibernate.dialect}"/>
        </bean>
    </property>
</bean>

<bean id="domainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${db.driver}" />
    <property name="jdbcUrl" value="${datasource.url}" />
    <property name="user" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
    <property name="initialPoolSize" value="5"/>
    <property name="minPoolSize" value="5"/>
    .....
</bean>

問題は、各方法の長所と短所はありますか、それとも単なる好みの問題ですか?

34
Roman

JavaEEコンテナを使用している場合は、大きな違いがあります。

個人的な好みよりも、いくつかの変更を加えた2番目のアプローチに従う方がはるかによいでしょう。

最初のケースでは、独自の接続プールを作成しており、コンテナ内の既存の接続プールから利益を得ていません。したがって、たとえば、データベースへの同時接続を最大20にコンテナを構成した場合でも、この新しい接続プールは構成によって制限されないため、この最大を保証することはできません。また、コンテナが提供する監視ツールから利益を得ることはできません

2番目のケースでは、独自の接続プールも作成していますが、上記と同じ欠点があります。ただし、このSpring Beanの定義を分離して、テスト実行でのみ使用できます。

あなたの最善の策は、 JNDI を介してコンテナの接続プールを検索することです。次に、コンテナーからのデータソース構成を尊重します。

これを使用してテストを実行します。

<!-- datasource-test.xml -->
<bean id="domainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
   <property name="driverClass" value="${db.driver}" />
   <property name="jdbcUrl" value="${datasource.url}" />
   <property name="user" value="${datasource.username}" />
   <property name="password" value="${datasource.password}" />
   <property name="initialPoolSize" value="5"/>
   <property name="minPoolSize" value="5"/>
.....
</bean>

JavaEEコンテナにデプロイするときにこれを使用します

<!-- datasource.xml -->
<jee:jndi-lookup id="domainDataSource" jndi-lookup="jndi/MyDataSource" />
  • JEEスキーマ を設定することを忘れないでください
  • Tomcatは完全なJavaEEコンテナではありませんが、JNDIを介してデータソースを管理するため、この回答は引き続き適用されます。
32
Leonel

あくまで個人的な好みです。

Springを既に使用している場合は、Springの構成を使用することをお勧めします。その目的は依存関係の注入と管理であるため、データベースへの依存関係に関してその役割を果たします。ただし、まだSpringを使用していない場合は、機能を維持しながらプロジェクトをよりシンプルに保つことができることを考慮して、永続化構成を使用してください。ただし、データベースと対話するためにHibernateを必要とするプロジェクトは、おそらくSpringを使用するのに十分な大きさであることをお勧めします。

4
Jesse Webb