2012-09-28 5 views
1

나는 비 웹 응용 프로그램에서 봄을 활용하고 DB를 사용하기 위해 최대 절전 모드를 사용하고 있습니다. 문제는 내가 발생하는 동안 "registerShutdownHook();" close Spring 컨텍스트 컨테이너가 제대로 종료되지 않고 JPA에 대한 자원을 닫아 DB에 대한 연결이 최대가되고있다.봄 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 층을 화재 및 EM은 DAO의로의 주입 "@Transactional"주석을 사용하여 위에서 제시된 구성을 사용합니다.

어쩌면 누군가가 내가 누락 된 부분이나 독립 실행 형 환경에서 JPA 세션의 적절한 종료를 처리하는 방법을 도와 줄 수 있습니까?

감사합니다.

P. 나는 점점 오전 예외는 다음과 같습니다 java.net.SocketException의 : 사용 가능한 버퍼 공간 (최대 연결 수에 도달?) : persistance.xml 구석 구석

<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> 

: 다음과 같이

+1

@Transactional은 EM을 주사하는 것이 아닙니다. 그렇습니까? –

+0

PersistenceAnnotationBeanPostProcessor - 내가 이해하는 한 EM을 주입하기 위해 @ Transactional 주석을 스캔합니다. – Xeperis

+3

나는 대신에 @ PersistenceUnit과 @ PersistenceContext를 스캔한다고 생각한다. –

답변

0

1.Create 트랜잭션 관리자를 연결하지

<context:component-scan base-package="com.yourcompany.basepackage" /> 
applicationContext.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.Add 다음 주석 (클래스 경로에 있어야합니다)

4.annoatate 당신의 EntityManager의 서비스 클래스는 같은 :

@PersistenceContext 
private EntityManager em = null; 

5.Inject TrasnsactionManager에 : 이것은 또 다른 예입니다

platformTransactionManager .persist(obj); 
+1

블로그에 대한 링크가 삭제되었습니다.이 질문에 대한 대답이 아닌 * 답입니다. 이와 같은 링크를 다시 게시하지 마십시오. –

0

:

private PlatformTransactionManager platformTransactionManager = null; 

6.persist 객체처럼 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> 
관련 문제