在为多个项目使用相同的Hibernate托管数据库时是否会导致问题?

时间:2016-01-01 08:46:17

标签: java hibernate wildfly jta

我使用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事务,因此我可以手动处理日志记录&#34;。第二个项目只使用JTA,因为我只在那里进行日志记录操作。项目A执行CRUD操作,项目B仅执行操作。两个项目都在同一个Wildfly服务器中运行。是否有可能在项目A和项目B之间发生任何问题,可能是锁定数据库,Wildfly中的事务或其他任何问题,同时使用来自不同项目的相同数据源访问同一数据库? 我不这么认为,但是我担心一些副作用和#39;可能会发生我还不知道。

2 个答案:

答案 0 :(得分:2)

应该没有任何问题,因为Datasource由jboss管理,它将根据您的配置分配连接,如果您使用相同的行来处理来自不同项目但是让数据库负责处理,则可能发生锁定。

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

答案 1 :(得分:1)

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

这是设计和更高耦合的问题,恰好导致DB上的技术耦合。我不确定我是否将其描述为正确的,作为一个高级别的问题:)