2

プールされたデータソースのプロキシをセットアップする必要がある状況があります。コードは次のとおりです。

<bean id="dataSourceBean" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close">
  <property name="driverClass" value="${jdbc.driverClassName}"/>
  <property name="jdbcUrl" value="${jdbc.url}"/>
  <property name="properties">
    <props>
        <prop key="c3p0.minPoolSize">0</prop>
        <prop key="hc3p0.maxPoolSize">100</prop>
        <prop key="hc3p0.timeout">60000</prop>
        <prop key="c3p0.acquire_increment">10</prop>
        <prop key="c3p0.max_statement">50</prop>
        <prop key="user">${jdbc.username}</prop>
        <prop key="password">${jdbc.password}</prop>
    </props>
  </property>
</bean>

<bean id="dataSourceLockAdvice" 
    class="com.ndot2.datasource.DataSourceLockAdvice"/>

<bean id="dataSource" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="dataSourceBean"/>

    <property name="interceptorNames">
        <list>
            <value>dataSourceLockAdvice</value>
        </list>
    </property>
</bean>

私が抱えている問題は、接続が閉じられなくなり、プロキシされたデータソースの destroy メソッドが呼び出されなくなったように見えることです...

Proxied Bean の Close メソッドを呼び出すにはどうすればよいですか? または、アドバイスを別の方法で実装する必要がありますか?

インターネットで検索してみましたが、これに対する答えが見つからないようです。助けていただければ幸いです。

編集:

リクエストに応じて、これが私のトランザクション管理宣言です (私は Appfuse を使用しています)

<aop:config>
    <aop:advisor id="userManagerTx" advice-ref="userManagerTxAdvice" pointcut="execution(* *..service.UserManager.*(..))" order="0"/>
    <aop:advisor id="userManagerSecurity" advice-ref="userSecurityAdvice" pointcut="execution(* *..service.UserManager.saveUser(..))" order="1"/>
    <aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2"/>
</aop:config>

<!-- Enable @Transactional support -->
<tx:annotation-driven/>

<!-- Enable @AspectJ support -->
<aop:aspectj-autoproxy/>

<!-- Activates scanning of @Autowired -->
<context:annotation-config/>

<!-- Activates scanning of @Service -->
<context:component-scan base-package="com.ndot2.service"/>

<tx:advice id="txAdvice">
    <tx:attributes>
        <!-- Read-only commented out to make things easier for end-users -->
        <!-- http://issues.appfuse.org/browse/APF-556 -->
        <!--tx:method name="get*" read-only="true"/-->
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<tx:advice id="userManagerTxAdvice">
    <tx:attributes>
        <tx:method name="save*" rollback-for="UserExistsException"/>
    </tx:attributes>
</tx:advice>

<bean id="userSecurityAdvice" class="com.ndot2.service.UserSecurityAdvice"/>

@Transactional または @AspectJ 駆動のトランザクション管理はありません...

4

1 に答える 1

0

アプリケーションで接続リークが発生した場合、最初に行うべきステップは、適切な監視ツールを使用して、リークが発生した場所を特定することです。c3p0 に関しては、関連する質問で説明されているように、JMX を介して接続監視を提供すると思います。

そのため、特定のサービス呼び出し中にリークが発生した場合は、デバッグ ツールと監視ツールを使用して確認できます。

次に、さまざまな特性に注意する必要があります。たとえば、構成で UserManager に複数のトランザクション アドバイスがあり、それが原因である可能性があります。アノテーション付きの構成を持つ Spring コンテナーでは、アノテーション付きのトランザクション管理が別の IoC コンテナー用に構成されているため、Bean がトランザクション プロキシによってラップされないという一般的なエラーが発生します。別の考えられる原因は、メソッドが手動でトランザクションを管理しようとして、これを正しく行うことに成功しないことです。

于 2012-11-16T11:46:52.330 に答える