我已经以两种方式看到(并完成了)数据源配置(下面的代码仅用于演示):
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>
问题是:每种方式都有任何利弊,或者仅仅是品味问题?
答案 0 :(得分: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>
<!-- datasource.xml -->
<jee:jndi-lookup id="domainDataSource" jndi-lookup="jndi/MyDataSource" />
答案 1 :(得分:4)
这完全是个人偏好。
如果你已经使用Spring,我的建议是使用Spring的配置。它的目的是依赖注入和管理,所以让它在你对数据库的依赖性方面做好自己的工作。但是,如果您还没有使用Spring,请坚持使用持久性配置,因为这样可以使您的项目更加简单,同时仍然可以正常运行。我会建议任何需要Hibernate与数据库交互的项目都可能足以容忍使用Spring。