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

2022-09-01 05:24:58

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

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)弹簧配置文件内部的配置(如应用程序上下文.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>

问题是:每种方式是否有任何优点和缺点,或者这只是一个品味问题?


答案 1

如果你在JavaEE容器中,这是一个巨大的差异。

比起个人喜好,如果你遵循第二种方法并做一些修改,你会好得多。

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

在第二种情况下,您还创建了自己的连接池,其缺点与上述相同。但是,您可以隔离此弹簧豆的定义,并仅在测试运行中使用它。

最好的办法是通过 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管理数据源,所以这个答案仍然适用。

答案 2

这完全是个人喜好。

我的建议是,如果你已经在使用Spring,那就使用Spring的配置。它的目的是依赖注入和管理,所以让它完成它对数据库的依赖性的工作。但是,如果您还没有使用Spring,请坚持使用持久性配置,因为这将使您的项目更简单,同时仍然有效。不过,我会建议,任何需要Hibernate与数据库交互的项目都可能足够大,可以容忍在里面使用Spring。


推荐