Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate在大约24小时后抛出JDBC异常。使用MYSQL/Hibernate_Java_Mysql_Hibernate - Fatal编程技术网

Java Hibernate在大约24小时后抛出JDBC异常。使用MYSQL/Hibernate

Java Hibernate在大约24小时后抛出JDBC异常。使用MYSQL/Hibernate,java,mysql,hibernate,Java,Mysql,Hibernate,服务器启动24小时左右后,hibernate将引发JDBCConnection异常。我正在使用Hibernate/Mysql/RESTJava项目 hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

服务器启动24小时左右后,hibernate将引发JDBCConnection异常。我正在使用Hibernate/Mysql/RESTJava项目

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/DB</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password"></property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="show_sql">false</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="cache.use_second_level_cache">true</property>
    <property name="cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>


    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">3000</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>

</session-factory>

这让我很头疼

在将连接提交给应用程序使用之前,经常会看到连接池中长期处于空闲状态的连接出现问题。大多数连接池都有控制连接验证的配置。在将连接提供给应用程序之前,您可能希望将c3po配置为测试连接。如果它发现连接不好,它将在内部处理异常,您将不必处理它。启用此选项的缺点是会有到数据库的额外往返,因此从连接池获取连接需要更长的时间

您可能希望使用
testConnectionOnCheckout
而不是
idleConnectionTestPeriod
(您可能正在使用它)

引用

配置连接测试

c3p0可以配置为测试其在网络中汇集的连接 多种方法,以最大限度地减少应用程序 请参阅断开或“陈旧”的连接。池连接可能会对一个用户造成不良影响 各种原因——一些JDBC驱动程序故意“超时” 持久的数据库连接;后端数据库或网络 有时会出现“绞合”共用连接;而连接可以 由于资源泄漏,随着时间的推移和使用而损坏, 驱动程序错误或其他原因

c3p0在测试中为用户提供了很大的灵活性 通过以下配置参数进行连接:

  • 自动测试表
  • ConnectionTestClassName
  • idleConnectionTestPeriod
  • preferredTestQuery
  • testConnectionOnCheckin
  • 测试连接取消检查
idleConnectionTestPeriod、TestConnectionOnOnCheckout和 TestConnectionOnOnCheck控制何时测试连接。 automaticTestTable、ConnectionTestClassName和preferredTestQuery 控制测试方式

在配置连接测试时,首先要尽量降低测试成本 每次测试。如果您使用的是JDBC驱动程序,那么您肯定 支持新的(ish)jdbc4 API,如果您使用的是c3p0-0.9.5或 更高让你的司机帮你处理。jdbc4连接 包括一个名为isValid()的方法,该方法应作为 快速、可靠的连接测试。默认情况下,c3p0将使用该方法 如果有

但是,如果您的驱动程序不支持此新的ish API,则c3p0 默认行为是通过调用getTables()来测试连接 连接的关联DatabaseMetaData对象上的。这有 其优点是非常健壮,可以使用任何数据库, 不管数据库模式如何。然而,一个电话 DatabaseMetaData.getTables()通常比简单的 数据库查询,并且使用此测试可能会严重损害您的 泳池的表现

在JDBC3驱动程序下加速连接测试的最简单方法 (或c3p0的0.9.5之前版本)是用 preferredTestQuery参数。但是要小心。背景 如果 之前的数据库中不存在查询目标表 初始化数据源。取决于您的数据库和JDBC 在驱动程序中,可以(也可以不)使用与表无关的查询,如SELECT 1 足以验证连接。如果是独立于表的查询 不够,您可以设置 参数自动测试表。使用您提供的名称,c3p0将 创建一个空表,并对其进行简单查询以测试 数据库

测试连接的最可靠时间是在退房时。但是这个 从客户机性能的角度来看,也是成本最高的选择。 大多数应用程序都应该结合使用 idleConnectionTestPeriod和TestConnectionOnOnCheckin。两者都是闲置的 测试和签入测试是异步执行的,可以 无论是感知的还是实际的,都能带来更好的绩效

对于某些应用程序,高性能比 偶尔出现数据库异常的风险。默认情况下 配置,c3p0根本不进行连接测试。设定 idleConnectionTestPeriod相当长,并且没有在签出和 签入是一种优秀的、高性能的方法


在将连接提交给应用程序使用之前,在连接池中闲置很长时间的连接经常会出现问题。大多数连接池都有控制连接验证的配置。在将连接提供给应用程序之前,您可能希望将c3po配置为测试连接。如果它发现连接不好,它将在内部处理异常,您将不必处理它。启用此选项的缺点是会有到数据库的额外往返,因此从连接池获取连接需要更长的时间

您可能希望使用
testConnectionOnCheckout
而不是
idleConnectionTestPeriod
(您可能正在使用它)

引用

配置连接测试

c3p0可以配置为测试其在网络中汇集的连接 多种方法,以最大限度地减少应用程序 请参阅断开或“陈旧”的连接。池连接可能会对一个用户造成不良影响 各种原因——一些JDBC驱动程序故意“超时” 持久的数据库连接;后端数据库或网络 有时会“搁浅”康涅狄格州
public class HibernateTemplate {
private static final Logger logger =    Logger.getLogger(HibernateTemplate.class);

static SessionFactory factory = null;
private Session session = null;
private Transaction txn = null;

public Session getSession() {
    try {
        if (session == null || !session.isOpen()) {
            session = factory.openSession();
            txn = session.beginTransaction();
        }
    } catch (JDBCConnectionException e) {

        logger.error("JDBC Connection Exception   " + e.getStackTrace());

    }
    return session;
}

public HibernateTemplate() {
    if (factory == null || factory.isClosed()) {
        factory = new Configuration().configure().buildSessionFactory();

    }
    getSession();
}

private void postAction() {
    txn.commit();
}

private void postSession() {
    if (session.isOpen())
        session.close();

}

public Object get(Criteria cr) {
    Object responseEntity = null;
    getSession();

    try {
        responseEntity = cr.list();
        smsSent = false;
    } catch (JDBCConnectionException e) {
        logger.error("JDBC Connection Exception   " + e.getStackTrace());


    } catch (Exception ex) {
        logger.error("Exception while fetching data using Hibernate Template " + ex);
        return "error";
    } finally {
        // postAction();
        postSession();
    }

    return responseEntity;
}
}