在多个项目中使用同一个 Hibernate 管理的数据库会不会导致问题?

Can it lead to problems while using the same Hibernate managed database for multiple projects?

我将 Wildfly 与 Hibernate 一起使用,我将有两个不同的项目访问同一个数据库。每个项目都有自己的 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 事务,因此我可以处理日志记录 "manually"。第二个项目仅使用 JTA,因为我只在那里进行日志记录操作。项目A做CRUD操作,项目B只做创建操作。两个项目 运行 在同一个 Wildfly 服务器中。是否有可能在项目 A 和项目 B 之间发生任何问题,例如锁定数据库、Wildfly 中的事务或其他问题,同时访问具有来自不同项目的相同数据源的相同数据库,就像我这样做一样? 我不这么认为,但我担心某些 'side effects' 可能会发生我还不知道。

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

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

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

这是一个设计问题,耦合度更高,恰好在DB上产生了技术上的耦合。作为一个高级别问题,我不确定我描述的是否正确:)