2015-10-16 66 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