Тайм-аут соединения Hibernate - PullRequest
2 голосов
/ 14 марта 2012

У нас проблема с подключением mysql на нашем сервере.WebApp работает правильно, но через несколько часов мы получаем сообщение об ошибке подключения к MySQL.Мы думаем, что что-то не так с Hibernate Session.Насколько нам известно, соединение mysql закрыто, а hibernate пытается использовать тот же сеанс.Возможно, мы не закрываем сессию должным образом.

Мы работаем со Struts 2, и мы определили Перехватчик, который управляет всем материалом сеанса.Вот код:

public class OSVStrutsInterceptors implements Interceptor {

private  static SessionFactory sf;

@Override
public void destroy() {

    try
    {
        sf.getCurrentSession().close();
    }
    catch (HibernateException ex)
    {
        throw new RuntimeException(ex);
    }
}

@Override
public void init() {

}

@Override
public String intercept(ActionInvocation ai) throws Exception {
    sf = HibernateUtil.getSessionFactory();
    Session sesion=sf.getCurrentSession();
    try {
    sesion.beginTransaction();
    }
    catch (Exception ex ) {
        System.out.println(new Date()+" Sesion cerrada. Obtenemos una nueva");
        sesion=sf.openSession();
    }

    String result=ai.invoke();
    sesion.getTransaction().commit();

    return result;

}
}

Как видите, мы пытаемся получить текущий сеанс, но если это невозможно, мы открываем новый сеанс.Также мы закрываем сессию метода destroy () перехватчика.

Но мы всегда получаем эту ошибку на нашем сервере:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Broken pipe

STACKTRACE:

java.net.SocketException: Broken pipe

Ответы [ 3 ]

4 голосов
/ 15 марта 2012

Добавление autoReconnect=true не рекомендуется MySQL (не удалось найти ссылку). Вместо этого добавьте эти строки на hibernate.cfg.xml

<!--  c3p0 -->
<property name="hibernate.c3p0.validate">true</property>
<property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">600</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1;</property>
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>

И добавьте эти библиотеки в ваш CLASSPATH

hibernate-c3p0-4.0.0.Final.jar
c3p0-0.9.1.jar (Not sure if this is neccessary)
1 голос
/ 14 марта 2012

Сбои в линии связи могут возникать по ряду причин, включая перебои в сети, неправильную настройку маршрутизатора или другие проблемы в сети. Также возможно (хотя маловероятно), что ваши соединения просто истекают. В любом случае вы можете попытаться устранить проблему, настроив источник данных MySQL для автоматического переподключения. Один из способов сделать это - указать соответствующее свойство в URL JDBC:

url="jdbc:mysql://localhost:3306/mydb?autoReconnect=true
0 голосов
/ 29 января 2014

Я использую пользовательский ConnectionProvider, который использует org.apache.commons.dbcp.BasicDataSource.в этом классе вы должны установить:

      setValidationQuery("select 1");
      setTestOnBorrow(true);

Примечание: я обернуть соединение с net.sf.log4jdbc.ConnectionSpy, но вы не можете сделать это

в hibernate.cfg

<property name="hibernate.connection.provider_class">
    example.DBCPConnectionProvider
</property>





public class DBCPConnectionProvider implements ConnectionProvider { 
    private static final long serialVersionUID = -4063997930726759172L;

    private static final Logger log = Logger.getLogger(DBCPConnectionProvider.class);

    static CustomDataSource ds;

    static{
        try {
            ds = new CustomDataSource();    
        } catch (Exception e) {
            log.error("", e);
        }
    }


    @Override
    public void closeConnection(Connection conn) throws SQLException {
        conn.close();
    }

    @Override
    public Connection getConnection() throws SQLException {
        return ds.getConnection();
    }




    @Override
    public boolean supportsAggressiveRelease() { 
        return true;
    }

    @Override
    public boolean isUnwrappableAs(Class arg0) {
        return false;
    }

    @Override
    public <T> T unwrap(Class<T> arg0) {
        return null;
    }

    }









public class CustomDataSource extends BasicDataSource{
    private static final Logger log = Logger.getLogger(CustomDataSource.class);


    public CustomDataSource(){  
        Properties props = HibernateConfiguration.getProperties(); 
          setDriverClassName( props.getProperty("hibernate.connection.driver_class")  );
          setUsername(  props.getProperty("hibernate.connection.username") );
          setPassword( props.getProperty("hibernate.connection.password")  );
          setUrl( props.getProperty("hibernate.connection.url")  ); 
          setValidationQuery("select 1");
          setTestOnBorrow(true);

    }

    @Override
    public Connection getConnection() throws SQLException{ 

        return   new net.sf.log4jdbc.ConnectionSpy( super.getConnection() );
    }
}
...