11

私は適切な方法で接続を処理しています。
1.アプリケーションで「Hibernate」接続プールを使用しています。プールから接続を取得するたびに、トランザクションの終了後にプールに戻ります。
2.データベースを監視して接続を確認しました。「アイドル接続」時間を 60 秒に設定しています。接続オブジェクトが 60 秒以上実行されていないことがわかりました。

それでも、このエラーが頻繁に発生します。そして、私のWebアプリケーションが停止しています。毎日Tomcatを一度再起動する必要があります。ただし、Tomcat を再起動せずに恒久的な解決策を探しています。
誰でも根本的な原因を説明できますか? これを修正できるように。

エラーログ:

INFO: Illegal access: this web application instance has been stopped already.  Could not load com.mchange.v2.c3p0.ComboPooledDataSourceBeanInfo.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    ...
    ...
    ...
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:679)

私のhibernate-contect.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.1.xsd
            ">

    <context:property-placeholder location="/WEB-INF/spring.properties" />

    <!-- Enable annotation style of managing transactions -->
    <tx:annotation-driven transaction-manager="transactionManager" />   

    <!-- Declare the Hibernate SessionFactory for retrieving Hibernate sessions -->
    <!-- See http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/hibernate3/annotation/AnnotationSessionFactoryBean.html -->                           
    <!-- See http://docs.jboss.org/hibernate/stable/core/api/index.html?org/hibernate/SessionFactory.html -->
    <!-- See http://docs.jboss.org/hibernate/stable/core/api/index.html?org/hibernate/Session.html -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
                 p:dataSource-ref="dataSource"
                 p:configLocation="${hibernate.config}"
                 p:packagesToScan="com.turborep.turbotracker"/>

    <!-- Declare a datasource that has pooling capabilities-->   
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
                destroy-method="close"
                p:driverClass="${app.jdbc.driverClassName}"
                p:jdbcUrl="${app.jdbc.url}"
                p:user="${app.jdbc.username}"
                p:password="${app.jdbc.password}"
                p:acquireIncrement="5"
                p:idleConnectionTestPeriod="60"
                p:maxPoolSize="100"
                p:maxStatements="50"
                p:minPoolSize="0" />

    <!-- Declare a transaction manager-->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
                p:sessionFactory-ref="sessionFactory" />

</beans>

Edit1:
今日、別のエラーが発生しました。ログは次のとおりです。

[ERROR] [ajp-bio-8009-exec-4 08:27:13] (JDBCExceptionReporter.java:logExceptions:234) Connections could not be acquired from the underlying database!
[ERROR] [ajp-bio-8009-exec-4 08:27:13] (JDBCExceptionReporter.java:logExceptions:234) Connections could not be acquired from the underlying database!
[ERROR] [ajp-bio-8009-exec-4 08:27:13] (JobServiceImpl.java:getRxmasterID:4399) Cannot open connection
org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    ...
    ...
    ... 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
    ... 50 more

接続の使用方法のサンプルコード:

@Resource(name="sessionFactory")
private SessionFactory itsSessionFactory;

@Override
public List<Userloginclone> getAllUserList() {
    itsLogger.debug("Retrieving all user list");
    Session aSession = null;
    List<Userloginclone> aQueryList = null;
    try {
        aSession = itsSessionFactory.openSession();
        Query aQuery = aSession.createQuery("FROM  Userloginclone");
        aQueryList = aQuery.list();
    } catch (Exception e) {
        itsLogger.error(e.getMessage(), e);
    } finally {
        aSession.close();
    }
    return  aQueryList;
}

私が何か間違ったことをしている場合は、私を修正してください。

4

3 に答える 3

7

あなたが直面している問題は、データベース接続とは関係ありません。

Tomcat を再起動してアプリを再デプロイしないと、この問題に直面することはないと思いますよね?

その原因は、Tomcat でアプリケーションを再デプロイすることです。アプリケーションを再デプロイするたびに、Web アプリケーションの新しいインスタンスが作成され、古いインスタンスは停止されます。以前のアプリケーションによってロードされた古いクラスがどこかにある可能性があります。または、アプリケーションが正しくアンデプロイされていません。

tomcat/lib に jar がありますか? JobQuoteFormController クラスと JobServiceImpl クラスを見せていただけますか?

于 2013-03-04T09:32:20.347 に答える
5

まず、Spring のトランザクション マネージャーと Hibernate を使用OpenSessionInViewFilterして、セッションとトランザクション管理を管理することをお勧めします。これら 2 つを使用すると、接続の管理について心配する必要がなく、 でセッションを取得できitsSessionFactory.getCurrentSession()ます。

次に、 Beanに追加する必要がありp:testConnectionOnCheckout="true"ます。dataSource

アプリケーションで何が起こっているかというと、接続が切断されると、切断されたままになります。これにより、切断された接続を再開できます。

于 2013-03-07T05:58:40.420 に答える