2009-04-06 5 views
3

나는 Hibernate와 MySQL을 사용하는 자바 웹 애플리케이션을 가지고있다. 사이트가 며칠 동안 사용하지 않을 경우, MySQL의 연결이 부실 가고, 나는 다음과 같은 예외를 만나 오전 : 경험에서부적절한 MySQL/Hibernate 연결을 피하는 방법 (MySQLNonTransientConnectionException)

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state. 

가 복구를 시도하는 연결을 구성하는 것이 가능하다 원시 JDBC를 사용하여 오류 또는 부실 연결에서,하지만 나는 최대 절전 모드를 사용하여 이것을하는 방법을 모른다. 나는 명시 적으로 close()를 호출하지 않고있다. (그러나 나는 Hibernate가 배짱이 깊숙이 박혀있다.)

내가 뭘해야하는지 아는 사람이 있습니까?

+0

연결이 유효한지 테스트하려면 연결에'isValid'를 사용 했습니까? 그렇지 않은 경우 다시 연결하십시오. 나는 이것이 서버 설정을 변경하지 않고도 문제를 해결해야한다고 생각한다. – Jus12

답변

4

어떤 연결 풀을 사용하고 있습니까?

Hibernate suggestion은 기본 제공 풀링을 사용하지 말고 응용 프로그램 서버 데이터 소스 또는 Commons DBCP 또는 C3PO과 같은 것을 사용하십시오.

3

나는 그 문제가 있었다. 연결 풀링 (c3p0)을 사용하면 사라졌습니다. 일반적으로 연결 풀링을 사용하는 것도 좋은 생각입니다.

2

감사합니다.

<property name="connection.datasource">java:/comp/env/jdbc/FooDB</property> 
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

이도 필요 내 웹 표준 '컨텍스트'항목을 추가 : 다음에 ...

<property name="connection.url">jdbc:mysql://localhost/FooDB</property> 
<property name="connection.username">root</property> 
<property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="connection.password">secret</property> 
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 

: 후손을 위하여, 나는 다음에서 hibernate.cfg.xml로 변경 응용 프로그램의 context.xml에 :

<Resource name="jdbc/FooDB" 
      auth="Container" 
      type="javax.sql.DataSource" 
      maxActive="100" 
      maxIdle="30" 
      maxWait="10000" 
      username="root" 
      password="secret" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/ss?autoReconnect=true" /> 

,
1

우리는 최대 절전 모드 MySQL 연결과 비슷한 문제가 발생했습니다. 그래서 우리는 다음과 같은 구성으로, C3P0를 시도 :

<property name=c3p0.acquire_increment>1</property> 
<property name=c3p0.idle_test_period>3600</property> 
<property name=c3p0.max_statements>0</property> 
<property name=c3p0.min_size>1</property> 
<property name=c3p0.timeout>3605</property> 
<property name=hibernate.c3p0.preferredTestQuery>select 1;</property> 

최대 절전 모드 connection_pool 크기가이 시간 제한 문제가 사라 만든 1

로 설정했다. 그러나 우리는 또 다른 문제에 직면하기 시작했습니다. 오래 기다려. 초당 5-6 개의 요청을받는 서비스 (jboss에서 실행되는 서블릿)가 있습니다. 모든 요청은 최대 절전 모드를 통해 mysql에 연결해야한다. 대부분의 요청은 5 ~ 6 번째 요청마다 삽입/업데이트로 선택합니다. 일반적으로 우리에 대한 요청 서비스 시간은 선택시 2-3ms이고 삽입/업데이트시 40-50ms입니다. 그러나 위의 C3P0 구성을 사용한 후 업데이트를 완료 한 모든 요청에 ​​거의 4-5 분이 걸리는 것으로 나타났습니다! 로그를 보면 무작위로 선택 요청이 중단되어 업데이트 요청을 받고 서비스 한 후에 만 ​​완료 할 수있는 것으로 보입니다.

C3P0 구성을 제거하면 위의 문제가 해결됩니다. 누군가가 우리가 잘못하고있는 것을 제안 할 수 있습니까?

<?xml version="1.0" encoding="utf-8" ?> 
<!DOCTYPE hibernate-configuration PUBLIC 
      "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
      "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://xxx.xxx.xxx</property> 
     <property name="connection.username">xxx</property> 
     <property name="connection.password">xxx</property> 
     <property name="connection.pool_size">1</property> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="current_session_context_class">thread</property> 
     <property name="hibernate.cache.use_query_cache">false</property> 
     <property name="hibernate.cache.use_second_level_cache">false</property> 
     <property name="show_sql">true</property> 
     <!-- Transaction isolation 2 = READ_COMMITTED --> 
     <property name="connection.isolation">2</property> 
     <property name="connection.autocommit">true</property> 
     <!-- configuration pool via c3p0--> 
     <property name="c3p0.acquire_increment">1</property> 
     <property name="c3p0.idle_test_period">3600</property> <!-- seconds --> 
     <property name="c3p0.max_size">1</property> 
     <property name="c3p0.max_statements">0</property> 
     <property name="c3p0.min_size">1</property> 
     <property name="c3p0.timeout">3605</property> <!-- seconds --> 
     <property name="hibernate.c3p0.preferredTestQuery">select 1;</property> 
    </session-factory> 
</hibernate-configuration> 
1
<property name="c3p0.acquire_increment">1</property> 
<property name="c3p0.idle_test_period">120</property> <!-- seconds --> 
<property name="c3p0.max_size">100</property> 
<property name="c3p0.max_statements">0</property> 
<property name="c3p0.min_size">10</property> 
<property name="c3p0.timeout">180</property> <!-- seconds --> 

재정의 설정 파일에 다음 설정을

여기에 참조에 대한 전체 최대 절전 모드 설정입니다. 그것은 당신에게 도움이 될 것입니다.