2012-09-28 61 views
1

我在非web應用程序中使用spring,並且使用hibernate處理數據庫。我遇到的問題是,雖然「registerShutdownHook();」並沒有關閉spring context container,它沒有正確關閉並關閉JPA的資源,所以我與DB的連接正在變得越來越多。Spring獨立應用程序中的JPA /休眠

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="pu" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="generateDdl" value="false" /> 
      <property name="showSql" value="false" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> 
     </bean> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager"/> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

我用上面介紹的配置火起來JPA圖層,使用「@Transactional」註釋注入EM是爲DAO的。

也許有人可以幫我解決我錯過了什麼,或者我應該如何處理在獨立環境中正確關閉JPA會話?

謝謝,

P.S.例外,我得到的是:java.net.SocketException異常:沒有可用的緩衝空間(最大連接數達到?):連接

+1

我認爲@Transactional不適用於注射EMs,是嗎? –

+0

PersistenceAnnotationBeanPostProcessor - 根據我的理解,掃描@Transactional註釋以注入EM。 – Xeperis

+3

我相信它會掃描「@ PersistenceUnit」和「@ PersistenceContext」,而不是 –

回答

0

1.創建事務管理器如下:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="persistenceUnitName" value="persistanceUnit"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="persistenceXmlLocation" value="classpath:persistence.xml"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="${db.orm.showsql}" />    
      <property name="generateDdl" value="${db.orm.generateDdl}" />    
      <property name="database" value="${db.type}"/> 
      <property name="databasePlatform" value="${db.orm.dialect}" /> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 

2.使用persistance.xml (應該是在類路徑)

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="persistanceUnit" transaction-type="RESOURCE_LOCAL"> 
    <description>Oracle db Persistence Unit</description> 
    <class>com.company.YourModelClass</class> 
    <properties/> 
    </persistence-unit> 
</persistence> 

3.添加在applicationContext.xml中

<context:component-scan base-package="com.yourcompany.basepackage" /> 
以下標註

4.annoatate您的EntityManager服務類,如:

@PersistenceContext 
private EntityManager em = null; 

5.Inject TrasnsactionManager到:

private PlatformTransactionManager platformTransactionManager = null; 

6.persist對象,如:

platformTransactionManager .persist(obj); 
+1

我已刪除鏈接到您的博客。它不是*這個問題的答案。不要像這樣重新發布鏈接。 –

0

這是另一個例子使用JPA應用Context.xml。這對我來說可以。

 <context:property-placeholder location=」classpath:jdbc.properties」/> 

     <!– Connection Pool –> 

     <bean id=」dataSource」 destroy-method=」close」> 

     <property name=」driverClass」 value=」${jdbc.driverClass}」/> 

     <property name=」jdbcUrl」 value=」${jdbc.url}」/> 

     <property name=」user」 value=」${jdbc.username}」/> 

     <property name=」password」 value=」${jdbc.password}」/> 

    </bean> 



     <!– JPA EntityManagerFactory –> 

     <bean id=」entityManagerFactory」 

        p:dataSource-ref=」dataSource」> 

      <property name=」jpaVendorAdapter」> 

        <bean> 

          <property name=」database」 value=」${jdbc.database}」/> 

           <property name=」showSql」 value=」${jdbc.showSql}」/>      

      </bean>   

      </property> 

     </bean> 

     <!– Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) –> 
     <bean id=」transactionManager」 

        p:entityManagerFactory-ref=」entityManagerFactory」/> 



     <!– Activates various annotations to be detected in bean classes for eg @Autowired–> 

     <context:annotation-config/> 



     <!– enable the configuration of transactional behavior based on annotations –> 

     <tx:annotation-driven transaction-manager=」transactionManager」/> 



     <!– Property Configurator –> 

    <bean id=」propertyConfigurer」> 

      <property name=」location」 value=」jdbc.properties」/> 

     </bean> 

    <context:component-scan base-package=」com.test.dao」/> 

</beans>