2015-10-16 33 views
0

我有一个使用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中,一切都按预期工作。

我失踪了什么?

+0

德比当然支持多个交易。是什么让你认为新的交易没有被创建?你的例外说什么?你的derby.log说什么?你有没有看过http://wiki.apache.org/db-derby/LockDebugging –

+0

就像@OndrejM说的,我在嵌入式内存模式下使用derby/h2。当应用程序创建新的事务时,derby或h2重新启动连接并重新创建数据库(即再次导入定制的sql导入文件)。 – voliveira89

+0

我知道Derby没有这样的限制,Derby开发人员名单上的其他人也没有提到过这个问题。我认为您看到的行为是由于您的应用程序中的某些内容或Spring框架连接到数据库的方式。 Derby本身不会“重新启动连接”或“导入自定义sql导入文件”;这些必须是Spring正在做的事情,或者你的应用程序正在做的事情。如果您可以将您的示例分解为独立的普通JDBC程序,那么我们可以检查Derby正在做什么。 –

回答

1

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

+0

我相信你是对的。有没有办法用spring/maven启动一个独立的德比(或H2)实例?或者这只有在嵌入式内存模式下才能实现? – voliveira89

+0

您可以直接从您的Java代码开始H2监听TCP端口,如下所述:http://stackoverflow.com/a/155237/784594。然后你可以使用[exec插件]从maven执行它(http://www.vineetmanohar.com/2009/11/3-ways-to-run-java-main-from-maven/)。但也许你只是想把它作为独立的服务器来运行。关键是你需要使用TCP连接来访问H2(或者Derby),使用jdbc url,像这样:'jdbc:h2:tcp:// localhost /〜/ test',而不是像这样'jdbc:h2:mem: '。请参阅[这里](http://www.h2database.com/html/cheatSheet.html)以查看差异。等同适用于德比。 – OndrejM