我有一個使用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正在做什麼。 –