6

Amazon EC2 を使用して Java Wicket アプリを実行しており、アプリケーション用に Amazon MySQL インスタンスを実行しています。すべて正常に動作しますが、8 時間後にデータベース接続が失われます。これが起こらないように c3p0 設定を構成しようとしました。また、MySQL の設定を更新しようとしましたが、助けにはなりません。

ここに私のpersitence.xmlがあります

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="xyz">
<persistence-unit name="mysqldb-ds" transaction-type="RESOURCE_LOCAL">

  <description>Persistence Unit</description>
  <provider>org.hibernate.ejb.HibernatePersistence</provider>

  <properties>
    <property name="hibernate.hbm2ddl.auto" value="update"/>
    <property name="hibernate.show_sql" value="true"/>
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
    <property name="hibernate.connection.username" value="XXXXX"/>
    <property name="hibernate.connection.password" value="YYYYY"/>
    <property name="hibernate.connection.url" value="jdbc:mysql://xxxx.yyyyy.us-east-1.rds.amazonaws.com:3306/paaluttaja"/>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
    <property name="connection.pool_size" value="1" />
    <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
    <property name="hibernate.c3p0.min_size" value="5" />
    <property name="hibernate.c3p0.max_size" value="20" />
    <property name="hibernate.c3p0.timeout" value="300" />
    <property name="hibernate.c3p0.max_statements" value="50" />
    <property name="hibernate.c3p0.idle_test_period" value="3000" />
  </properties>

</persistence-unit>
</persistence>

私は次のようなクエリを作成しています:

@Service
public class LoginServiceImpl implements LoginService{

@Override
public Customer login(String username, String password) throws LSGeneralException {
    EntityManager em = EntityManagerUtil.getEm();

    TypedQuery<Customer> query = em.createQuery("SELECT c FROM Customer c "
            + "WHERE c.username = '" + username + "' "
            + "AND c.password = '" + password + "'", Customer.class);

    Customer customer = null;

    try {
        customer = (Customer) query.getSingleResult();
    }catch(Exception e){
        if(e instanceof NoResultException){
            throw new LSGeneralException("login.failed.wrong.credentials", e);
        }else{
            throw new LSGeneralException("failure", e);
        }
    }

    customer.setLogged(true);

    return customer;

}

}

すべての助けをいただければ幸いです。

4

1 に答える 1

3

まず、ログで c3p0 の構成のダンプを確認することをお勧めします。5 分間のタイムアウトにより、MySQL 接続が 8 時間後に失効するのを防ぐことができますが、何らかの理由でそれが発生していないようです。c3p0 プロパティ 'maxIdleTime' が実際に期待どおり 300 であるかどうかを確認します。とにかく、追加してみてください

hibernate.c3p0.preferredTestQuery=SELECT 1
hibernate.c3p0.testConnectionOnCheckout=true

これは、接続の有効性を確認する最も簡単な方法です。チェックアウトごとに (効率的なクエリを使用して) テストします。また、比較的高価です。それが問題であることがわかった場合は、より賢明な方法に進むことができます。ただし、信頼できるセットアップを取得できることを確認してから、そこから最適化することをお勧めします. ここ を参照してください

hibernate.c3p0.idle_test_period=3000あなたが思うようにプールが構成されている場合、your は役に立たないことに注意してください。アイドル状態の接続は、3000 秒のテスト間隔が経過するずっと前にタイムアウトになります。

于 2013-02-20T12:13:24.253 に答える