【问题标题】:Can it lead to problems while using the same Hibernate managed database for multiple projects?将同一个 Hibernate 托管数据库用于多个项目时会导致问题吗?
【发布时间】:2016-04-05 21:59:32
【问题描述】:

我在 Hibernate 中使用 Wildfly,我将有两个不同的项目访问同一个数据库。每个项目都有自己的persistence.xml,但persistence.xml 中的数据源是相同的。目前我有一个使用这些数据源的项目。这看起来像这样:

项目 A:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
    version="2.1">

    <persistence-unit name="MyProjectPersistenceUnit" transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/myprojectDS</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.connection.useUnicode" value="true" />
            <property name="hibernate.connection.characterEncoding" value="UTF-8" />
            <property name="hibernate.connection.charSet" value="UTF-8" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
        </properties>
    </persistence-unit>

    <persistence-unit name="MyProjectLoggingUnit" transaction-type="RESOURCE_LOCAL">
        <non-jta-data-source>java:jboss/datasources/myprojectDS</non-jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.connection.useUnicode" value="true" />
            <property name="hibernate.connection.characterEncoding" value="UTF-8" />
            <property name="hibernate.connection.charSet" value="UTF-8" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
        </properties>
    </persistence-unit>

</persistence>

附加项目的persistence.xml 将如下所示:

项目 B:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
    version="2.1">

    <persistence-unit name="MyProjectLoggingUnit" transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/myprojectDS</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.connection.useUnicode" value="true" />
            <property name="hibernate.connection.characterEncoding" value="UTF-8" />
            <property name="hibernate.connection.charSet" value="UTF-8" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
        </properties>
    </persistence-unit>

</persistence>

第一个项目同时使用 JTA 和 RESOURCE_LOCAL 事务,因此我可以“手动”处理日志记录。第二个项目只使用 JTA,因为我只在那里进行日志记录操作。项目 A 进行 CRUD 操作,项目 B 仅创建操作。两个项目都在同一个 Wildfly 服务器中运行。是否有可能在项目 A 和项目 B 之间发生任何问题,可能是锁定数据库、Wildfly 中的事务或其他任何问题,同时使用来自不同项目的相同数据源访问同一个数据库? 我不这么认为,但恐怕会出现一些我还不知道的“副作用”。

【问题讨论】:

    标签: java hibernate wildfly jta


    【解决方案1】:

    应该没有任何问题,因为数据源是由 jboss 管理的,它会根据你的配置分配连接,如果你使用同一行来处理不同项目的处理,可能会发生锁定,但让数据库来处理。

    并且有不同的实体涉及不创建任何问题,例如 TCP 连接是相同的/共享会话和事务对于操作来说是不同的,spring 和 hibernate 都是成熟的并且它们做得最好,除非你搞砸了配置;),你看起来不错。

    【讨论】:

      【解决方案2】:

      我同意原则上您不必担心!但是,由于我们不是在处理魔术,并且当某些东西不起作用时总会有解释,所以您应该担心的唯一情况是两个应用程序之间的潜在业务耦合,当然最终会出现在数据库中。我想说的是,如果 Application1 使用与 Application2 相同的数据库,对最终预期可见的实体执行操作/更新另一个应用程序上的逻辑,那么是的,您可能有机会面临一些技术死锁(最终对于数据库来说非常好),但可能是业务代码级别的问题。

      这是设计和更高耦合的问题,这恰好导致数据库上的技术耦合。我不确定我是否正确地描述了它,作为一个高级问题:)

      【讨论】:

      • 你是对的,但这不会发生。我唯一要做的就是从两个项目都使用的公用表中读取数据,然后写入两个项目都使用的日志表。这两个操作的业务逻辑没有问题。 (实际上两个子项目都属于一个大项目,但它们是不同的部分)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2023-02-06
      • 1970-01-01
      • 2016-09-13
      • 2013-04-01
      相关资源
      最近更新 更多