当前位置: 首页 > 面试题库 >

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

林玮
2023-03-14
问题内容

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

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>

问题是:每种方式都有优点和缺点,还是只是口味问题?


问题答案:

如果您位于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>

部署到JavaEE容器时使用它

<!-- datasource.xml -->
<jee:jndi-lookup id="domainDataSource" jndi-lookup="jndi/MyDataSource" />
  • 记住要设置JEE模式
  • 尽管Tomcat不是完整的JavaEE容器,但它确实通过JNDI管理数据源,因此此答案仍然适用。


 类似资料:
  • 根据反馈更新问题: 我有一个spring-boot应用程序,它有三个数据库:H2用于集成测试,Postgresql用于qa和Production。由于spring-boot为您创建了默认的数据源,所以我没有为集成测试定义任何内容。我想我应该使用Application.Properties来定义我的数据源连接值,但我不确定处理这个问题的最佳方法是什么。 我还没有弄清楚如何在IntelliJ中设置默认

  • 我正在使用Spring2.x、Spring Data REST、Hibernate5.x、MySQL创建一个服务器REST应用程序。 我按照以下准则配置了多租户:https://dzone.com/articles/spring-boot-hibernate-multitenancy-implementation,唯一的区别是我使用了每个租户一个数据库。 我有一个来创建到DB的连接,还有一个来获取

  • 问题内容: 目前,我正在使用带有@Transactional批注的DriverManagerDataSource来管理事务。但是所有事务都非常非常慢,这可能是因为数据源每次都打开和关闭与db的连接。 我应该使用什么数据源来加快交易速度? 问题答案: 实际上不是连接池,只能用于测试。您应该尝试使用Apache Commons DBCP 。就像是:

  • 配置项说明 schemaName: # 逻辑数据源名称 dataSources: # 数据源配置,可配置多个 <data-source-name> <data-source-name>: # 与 ShardingSphere-JDBC 配置不同,无需配置数据库连接池 url: #数据库 URL 连接 username: # 数据库用户名 password: # 数据库

  • 我不确定我是否很好地理解了Spring概要文件是如何处理yaml和属性文件的。我试图将这两种类型的配置分开(这两个文件不共享任何配置),但在从yaml配置中读取配置文件时遇到了问题。 我的问题是,当我试图(通过xml)配置我的数据源时,这样做: Spring总是使用YAML文件中的最后一个配置,忽略概要文件。我试图通过web.xml中的contex-parameter或直接将活动概要文件传递给JV

  • 我有一个Spring启动应用程序,我想为它添加liquibase配置更改日志。 我创建了一个用于配置liquibase的LiquibaseConfig类: 我已经在属性文件中配置了数据源信息: 当我运行我的应用程序时,我收到这个错误: 现在我明白了,这意味着应用程序无法自动连接