我有一个使用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中,一切都按预期工作。
我缺少什么?
答案 0 :(得分:1)
您似乎在嵌入式内存模式下使用derby。 AFAIK,当您通过TCP连接进行连接时,derby和H2都只支持独立模式下的并发事务,但不支持嵌入模式。尝试将derby作为单独的程序运行,并更改数据库以连接到它。