2013-02-20 13 views
6

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

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

} 

} 

すべてのヘルプはいただければ幸いです。ここ

は、私はこのようなクエリを作っています、私の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> 

です。

答えて

2

まず、configのc3p0のダンプをログで確認することができます。あなたの5分のタイムアウトはMySQL接続が8時間後に古くなるのを防ぐはずですが、何らかの理由でそれが起こっていないようです。 c3p0のプロパティ 'maxIdleTime'が実際に300と予想されるかどうかを確認する必要があります。とにかく、あなたは

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

を追加してみてください、これは接続の妥当性を確保するための最も簡単な方法です - すべてのチェックアウトに(効率的なクエリで)それらをテスト。それはまた比較的高価である。それが問題だと分かった場合、あなたは何かに精通した人に行くことができます。しかし、あなたが信頼できるセットアップを得てそこから最適化できることを確認することは良いことです。 See here

あなたのプールがあなたが思うように設定されている場合は、hibernate.c3p0.idle_test_period=3000は役に立ちません。アイドル接続は、3000秒のテスト間隔が過ぎるずっと前にタイムアウトします。

+0

私は設定にいくつかの変更を加えました。モニタリングでは、hibernate.c3p0.min_size = 5が有効になっていることが示されています。監視画像:http://oi49.tinypic.com/35hipee.jpg – TuomasSaranen

+0

こんにちはスティーブ、私の最近の質問を見ることができます、それは多少関連しています:http://stackoverflow.com/questions/19664878/configure-c3p0接続終了時にセッションを終了しますか?ありがとう – amphibient