在persistence.xml和spring配置文件中配置数据源之间的区别

Rom*_*man 34 java spring persistence jpa

我已经以两种方式看到(并完成了)数据源配置(下面的代码仅用于演示):

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

问题是:每种方式都有任何利弊,或者只是品味问题?

Leo*_*nel 32

如果你在JavaEE容器中,它会产生很大的不同.

除了个人偏好之外,如果您通过一些修改来遵循第二种方法,那么您会好得多.

在第一种情况下,您正在创建自己的连接池,而不是从容器中的现有连接池中获利.因此,即使您将容器配置为最多20个同时连接到数据库的连接,也无法保证此最大值,因为此新连接池不受您的配置限制.此外,您不会从容器为您提供的任何监视工具中获利.

在第二种情况下,您还要创建自己的连接池,具有与上面相同的缺点.但是,您可以隔离此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>
Run Code Online (Sandbox Code Playgroud)

在部署到JavaEE容器时使用此选项

<!-- datasource.xml -->
<jee:jndi-lookup id="domainDataSource" jndi-lookup="jndi/MyDataSource" />
Run Code Online (Sandbox Code Playgroud)
  • 请记住设置JEE架构
  • 尽管Tomcat不是完整的JavaEE容器,但它确实通过JNDI管理数据源,因此这个答案仍然适用.