Spring和H2或Derby - 多个交易

时间:2015-10-16 10:32:58

标签: spring jpa transactions derby h2

我有一个使用Spring的项目。在本地环境中,我使用Derby(带有Jetty),这给了我在这个环境中所需的性能(在生产中使用的是Oracle和Weblogic)。

问题是我需要在某些特定操作中进行新的交易。此特定操作使用注释@Transactional(propagation = REQUIRES_NEW)。

问题在于,当Derby到来时,新事务应该是createad的时间,操作会挂起,并且会有适当的时间。我尝试使用H2但是在创建新事务的同一时刻,数据库重新启动,这意味着,表将被删除并再次创建。

Derby和H2不支持多笔交易?我找不到任何告诉我相反的事情。

我的数据库配置是:

<bean id="entityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    ...
    <property name="persistenceUnitName" value="ORACLE_PU"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
            <property name="showSql" value="true"/>
            <property name="generateDdl" value="true"/>
            <property name="databasePlatform" value="org.eclipse.persistence.platform.database.DerbyPlatform"/>
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="shared-cache-mode">NONE</prop>
            <prop key="eclipselink.cache.shared.default">false</prop>
            <prop key="eclipselink.query-results-cache">false</prop>
            <prop key="eclipselink.weaving">false</prop>
            <prop key="eclipselink.ddl-generation">${oracle.eclipselink.ddl.generation}</prop>
            <prop key="eclipselink.ddl-generation.output-mode">database</prop>
            <prop key="eclipselink.create-ddl-jdbc-file-name">create-tables.sql</prop>
            <prop key="eclipselink.drop-ddl-jdbc-file-name">drop-tables.sql</prop>
            <prop key="eclipselink.application-location">target/generated-sources/database</prop>
            <prop key="eclipselink.jdbc.cache-statements">true</prop>
            <prop key="eclipselink.custom.sql.import.file">${oracle.eclipselink.custom.sql.import.file}</prop>
            ...
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManager"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
    <property name="url" value="jdbc:derby:target/memory;create=true"/>
    <property name="username" value="test"/>
    <property name="password" value="test"/>
</bean>

我对H2的尝试与此类似,但配置正确。在weblogic environemnt中,一切都按预期工作。

我缺少什么?

1 个答案:

答案 0 :(得分:1)

您似乎在嵌入式内存模式下使用derby。 AFAIK,当您通过TCP连接进行连接时,derby和H2都只支持独立模式下的并发事务,但不支持嵌入模式。尝试将derby作为单独的程序运行,并更改数据库以连接到它。