我有一个使用Spring的项目。在本地环境中,我使用了Derby(使用Jetty),这使我在这个环境中需要的性能(在生产中使用Oracle和Weblogic)。春季和H2或德比 - 多笔交易
问题是我需要一些特定操作中的新事务。此特定操作使用注释@Transactional(propagation = REQUIRES_NEW)。
问题在于,在Derby到达新事务应该是createad的时候,操作会挂起,并且由于超时。我尝试使用H2,但在创建新事务的同一时刻,数据库重新启动,意味着表被删除并重新创建。
德比和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中,一切都按预期工作。
我失踪了什么?
德比当然支持多个交易。是什么让你认为新的交易没有被创建?你的例外说什么?你的derby.log说什么?你有没有看过http://wiki.apache.org/db-derby/LockDebugging –
就像@OndrejM说的,我在嵌入式内存模式下使用derby/h2。当应用程序创建新的事务时,derby或h2重新启动连接并重新创建数据库(即再次导入定制的sql导入文件)。 – voliveira89
我知道Derby没有这样的限制,Derby开发人员名单上的其他人也没有提到过这个问题。我认为您看到的行为是由于您的应用程序中的某些内容或Spring框架连接到数据库的方式。 Derby本身不会“重新启动连接”或“导入自定义sql导入文件”;这些必须是Spring正在做的事情,或者你的应用程序正在做的事情。如果您可以将您的示例分解为独立的普通JDBC程序,那么我们可以检查Derby正在做什么。 –