1

私は非 Web アプリケーションで春を利用しており、DB を操作するために休止状態を使用しています。私が経験している問題は、「registerShutdownHook();」の間です。スプリング コンテキスト コンテナを閉じると、適切にシャットダウンされず、JPA のリソースが閉じられないため、DB への接続が限界に達しています。

<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 セッションを適切に閉じる方法を教えてくれるでしょうか?

ありがとうございました、

私が取得している PS Exception は次のとおりです: java.net.SocketException: No buffer space available (最大接続数に達しましたか?): connect

4

2 に答える 2

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.次のようなサービスクラスでEntitymanagerに注釈を付けます。

 @PersistenceContext
 private EntityManager em = null;

5. TrasnsactionManager を以下に注入します。

private PlatformTransactionManager platformTransactionManager = null;

6.次のようなオブジェクトを永続化します。

platformTransactionManager .persist(obj);
于 2012-10-17T12:37:09.673 に答える
0

これは、JPA を使用したアプリケーション Context.xml の別の例です。それは私にとってはうまくいきます。

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

      <!– Connection Pool –&gt;

      <bean id=”dataSource” destroy-method=”close”&gt;

        <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 –&gt;

      <bean id=”entityManagerFactory”

                  p:dataSource-ref=”dataSource”&gt;

            <property name=”jpaVendorAdapter”&gt;

                  <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) –&gt;
      <bean id=”transactionManager”

                  p:entityManagerFactory-ref=”entityManagerFactory”/>



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

      <context:annotation-config/>



        <!– enable the configuration of transactional behavior based on annotations  –&gt;

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



      <!– Property Configurator –&gt;

    <bean id=”propertyConfigurer”&gt;

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

      </bean>

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

</beans>
于 2012-10-18T13:14:49.620 に答える