http://bjzhanghao.cnblogs.com/archive/2004/12/10/75145.html
在一个项目中,客户要求除操作系统外全部使用免费软件,因此我使用了Mysql 4.0作为数据库服务器,其JDBC驱动为3.0.9版本,在给客户安装后调试一切正常。可是到了第二天,只要一登录就提示“No operations allowed after connection closed”异常,显示在浏览器上。在经过一番检查后我发现,在这种情况下只要重新启动Tomcat就恢复正常,然而到了第二天问题依旧。
在网上查找一下,原来Mysql在经过8小时不使用后会自动关闭已打开的连接,摘录原文如下:
5.4. | I have a servlet/application that works fine for a day, and then stops working overnight |
| MySQL closes connections after 8 hours of inactivity. You either need to use a connection pool that handles stale connections or use the "autoReconnect" parameter (see "Developing Applications with MySQL Connector/J"). Also, you should be catching SQLExceptions in your application and dealing with them, rather than propagating them all the way until your application exits, this is just good programming practice. MySQL Connector/J will set the SQLState (see java.sql.SQLException.getSQLState() in your APIDOCS) to "08S01" when it encounters network-connectivity issues during the processing of a query. Your application code should then attempt to re-connect to MySQL at this point. |
在客户那边,晚上时间是不会有人使用这个系统的,就造成了系统中原先没有考虑到的这个情况。
为此我试验了三种方法:1、在数据库的url中加入autoReconnect=true;2、在每次调用getSession()方法时判断session.isClosed()是否为真,若为真则调用session.reconnect();3、在经过两天,事实证明前两种方法都不起作用的情况下,我在这个页面找到了第三种方法,即不使用Hibernate内置的连接池(Hibernate强烈推荐不使用但我以前一直在用),改用C3P0连接池,这个连接池会自动处理数据库连接被关闭的情况。要使用C3P0很简单,先从Hibernate里把c3p0-0.8.3.jar复制到项目的lib目录中,再在hibernate.properties里去掉hibernate.c3p0开头的那些属性的注释(使用缺省值或自己需要的数值),这样Hibernate就会自动使用C3P0代替内置的连接池了。到目前为止前面的问题没有再出现过。
以前对Hibernate警告不要使用内置连接池作产品用途没有太放在心上,这次是一个教训,所以不论从稳定还是性能的考虑,都应该选择相对更加成熟的连接池。
update:除了连接池的原因,原先写的HibernateDAO类也有问题,在有些情况下一个session会被多个请求反复使用,现在已改正。另外,c3p0这个名字不是星球大战里那个机器人么?
分享到:
相关推荐
在本课程设计中,我们将探讨如何使用Java编程语言与MySQL数据库进行交互,构建一个飞机订票系统。这个系统涵盖了基础的数据库操作,如增、删、改、查,以及更高级的功能,如订票、退票和客户信息管理。下面将详细...
在Java编程语言中,连接MySQL数据库是开发许多应用程序的基础,特别是涉及到数据存储和检索的系统。本教程将介绍如何使用Java实现一个简单的学生成绩管理系统,该系统完全基于控制台输出,适合Java初学者进行基础...
- 为了优化性能,开发者通常使用连接池(如C3P0、HikariCP、Apache DBCP等),预先创建并维护一定数量的数据库连接,避免频繁创建和关闭连接。 7. **JPA和Hibernate** - Java Persistence API (JPA) 是Java EE的...
Java连接MySQL模板是Java开发中常见的一种技术,用于在Java应用程序中与MySQL数据库进行交互。在Java中,我们通常使用JDBC(Java Database Connectivity)API来实现这一目标。以下是关于这个主题的详细知识: 1. **...
在Java编程中,链接多个数据库是一项常见的需求,特别是在构建分布式系统或者需要整合不同数据源的应用中。本示例提供了一个完整的Java配置DEMO,演示了如何实现这一功能。在这个项目中,我们主要会讨论以下几个核心...
例如,MySQL数据库需要mysql-connector-java.jar驱动,Oracle需要ojdbc.jar等。 3. 连接步骤:(i) 加载驱动,(ii) 建立连接,(iii) 创建Statement或PreparedStatement对象,(iv) 执行SQL,(v) 处理结果,(vi) 关闭...
本文将详细介绍如何使用JSP连接并操作Oracle、SQL Server、MySQL等多种数据库,并通过具体示例代码进行演示。 #### JSP与数据库连接基础 在JSP中连接数据库通常涉及到以下几个步骤: 1. **加载数据库驱动**:根据所...
3. **异常处理**:在获取和关闭连接时,应处理可能的SQLException,避免程序因数据库问题而中断。 4. **线程安全**:确保数据源对象的线程安全性,防止并发访问时出现数据混乱。 总之,C3P0作为一款轻量级的数据库...
下面是一段简单的使用JDBC连接MySQL数据库的示例代码: ```java import java.sql.*; public class JdbcConnectionExample { public static void main(String[] args) { String url = "jdbc:mysql://localhost:...
C3P0支持多种数据库,包括MySQL、Oracle、PostgreSQL等,并且与Hibernate、Spring等框架有良好的集成。 **C3P0的工作原理** 1. **连接初始化**:当应用程序启动时,C3P0会根据配置参数预先创建一定数量的数据库连接...
例如,如果我们使用的是MySQL数据库,我们需要添加MySQL Connector/J驱动到项目的类路径中。这可以通过Maven或Gradle的依赖管理实现,或者直接将jar文件放入项目的lib目录。 2. **注册JDBC驱动** 使用`Class.for...
在尝试连接数据库时,应始终包含异常处理,以便在出现错误时能够捕获并处理。通常的做法是使用`try-catch`块来捕获`ClassNotFoundException`和`SQLException`。 6. **数据库选择**: 选择数据库并不只关乎其...
本教程主要介绍如何在Eclipse环境中,使用JSP文件链接SQLServer2012、Oracle和MySQL这三种常见的关系型数据库,提供详细的操作步骤和可能遇到的问题解决方案。 首先,让我们了解Eclipse。Eclipse是一款开源的集成...
数据库连接池在初始化时会创建一定数量的数据库连接,并将这些连接保存在一个池中,当应用程序需要访问数据库时,可以从池中获取一个已存在的连接,用完后归还,而不是每次操作都创建新的连接。这种方式减少了创建和...
通常使用`finally`块确保即使在异常情况下也能正确关闭。 7. **事务管理**: JDBC支持事务处理,通过`Connection`对象的`setAutoCommit()`方法可以控制是否自动提交。在多条SQL操作时,可以手动开启和提交事务,以...
MySQL的交互式连接和非交互式连接是数据库操作中的两种不同模式,主要...因此,为了防止此类异常,开发人员应在使用数据库连接时进行有效性检查,并及时关闭不再使用的连接,或者设置合理的超时时间以适应应用需求。
在提供的代码片段中,我们看到的不是标准的JavaBean,而是一个名为`jdbc_sql`的类,它主要用于处理Java和MySQL数据库之间的交互。这个类包含了连接数据库、执行SQL查询和更新、以及关闭数据库连接的方法。这些方法是...
2. **连接池**: 为提高性能和资源利用率,可以使用连接池如C3P0、HikariCP等管理数据库连接,避免频繁创建和关闭连接。 3. **CallableStatement**: 用于调用数据库的存储过程,可以处理带有输入、输出和输入/输出...
在Java编程领域,数据库编程是不可或缺的一部分,尤其是在开发企业级应用程序时。`Java Database Programming Example Code 2.2`很可能是某个教程或书籍中的一个章节,专注于介绍如何使用Java进行数据库交互。在这个...