`
ynztpwl
  • 浏览: 59508 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

log4j+JDBC+mySQL 将对象写入数据库

 
阅读更多

当log4j与MySQL长时间连接的时候,会发现数据库日志不再记录,查看系统日志发现抛出如下异常:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:

The last packet successfully received from the server was62258 seconds ago.The last packet sent successfully to the server was 62258 seconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

造成这种问题的原因有如下两个方面:

1、mysql会自动把超过wait_timeout时间的connection单方面切断。

2、log4j没有采用系统的连接池来托管数据库连接而是采用了jdbc连接,该连接一旦获取,便不再释放,当遇上第一种情况时,自然会抛出异常。


解决办法其实也挺简单,就是按照提示在使用application之前先判断connection是否有效,如果无效则重新获取连接即可。

此时需参考log4j中JDBCAppender的getConnectino方法的实现源代码:

protected Connection getConnection() throws SQLException {
if (!DriverManager.getDrivers().hasMoreElements())
setDriver("sun.jdbc.odbc.JdbcOdbcDriver");

if (connection == null) {
connection = DriverManager.getConnection(databaseURL, databaseUser,
databasePassword);
}

return connection;
}

我们再写一个JDBCAppender继承log4j,重写getConnection,增加测试连接是否有效的语句:

@Override
protected Connection getConnection() throws SQLException {
// TODO Auto-generated method stub
if (!DriverManager.getDrivers().hasMoreElements())
setDriver("sun.jdbc.odbc.JdbcOdbcDriver");

// 判断连接是否实效,如果失效,则重新获取连接
com.mysql.jdbc.Connection cn = (com.mysql.jdbc.Connection) connection;
try {
cn.ping();
} catch (SQLException e) {
System.out.println(new java.text.SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss").format(new Date())
+ "LOG4J连接失效,将重新获取连接");
connection = null;
}
if (connection == null) {
connection = DriverManager.getConnection(databaseURL, databaseUser,
databasePassword);
}

return connection;
}

注意,不能用connection中的isClose来判断连接是否有效,因为java帮助文档中有这样的话:

This method generally cannot be called to determine whether aconnection to a database is valid or invalid. A typical clientcan determine that a connection is invalid by catching any exceptions that might be thrown when an operation is attempted。

解铃还须系铃人,看来mysql长时间连接问题,只能通过mysql数据库驱动中的方法去解决,刚好com.mysql.jdbc.Connection提供了ping方法,该方法的说明为:

Detect if the connection is still good by sending a ping command to the server.

正好可以用来测试连接是否有效,如果抛出异常,则需要重新获取数据库连接(获取之前需要先把原来的连接置为null,不然失效的connection会像滚雪球一样原来越多。。。。。)。

我所采用的log4j的版本为1.2.14,不知道后续的版本有没有解决这个问题。

分享到:
评论

相关推荐

    log4j使用与java中log4j记录日志如何写入数据库

    本文将详细介绍如何在Java中使用Log4j来记录日志,并将其写入数据库。 首先,我们需要了解Log4j的基本结构。一个简单的Log4j项目通常包含以下几个部分: 1. **配置文件**:Log4j的配置文件通常是`log4j.properties...

    log4j2.xml记录日志到到数据库

    在我们的示例中,我们关注的是如何配置Log4j2以将日志写入MySQL数据库。首先,我们需要在`log4j2.xml`配置文件中定义一个使用JDBC Appender的配置: ```xml <JDBC name="DatabaseAppender" tableName="logs"> ...

    如何借助log4j把日志写入数据库中

    然后,在Java代码中,我们可以创建并使用Logger对象,Log4j会自动将日志信息写入数据库。例如: ```java import org.apache.log4j.Logger; public class LogDemo { private static final Logger logger = Logger....

    log4j日志写入数据库实例

    在“log4j日志写入数据库实例”中,我们将关注如何配置Log4j将日志信息存储到数据库中,以便于后期分析和检索。 要实现这个功能,我们需要创建一个Appender,该Appender能够与数据库进行交互。通常,我们会使用...

    log4j添加日志到数据库和文件中

    Log4j的核心优势在于其可配置性,可以根据不同的需求将日志输出到控制台、文件、数据库甚至网络上。 在"log4j添加日志到数据库和文件中"的场景中,我们首先需要理解Log4j的基本架构。它主要由三个组件构成:Logger...

    日志配置到文件,数据库

    - `log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/log4j`:连接数据库的URL。 - `log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver`:MySQL驱动类。 - `log4j.appender.DATABASE.user=root`:...

    log4j学习笔记及写入数据库配置

    在学习Log4j的过程中,阅读“log4j学习笔记及写入数据库配置”这份资料将有助于深入理解Log4j的使用,包括具体的配置步骤、常见问题以及最佳实践。通过实践,你可以更好地掌握如何利用Log4j来提升你的应用程序的可...

    使用log4j 记录日志到数据库

    这篇博客“使用log4j记录日志到数据库”将介绍如何配置和使用Log4j,以便将日志信息存储到数据库中,而非传统的文本文件。数据库存储的日志便于进行结构化查询,有助于进行长期的数据分析和管理。 首先,理解Log4j...

    log4j输出日志到数据库表中

    2. **Log4j配置**:要将日志输出到数据库,需要在`log4j.properties`或`log4j.xml`配置文件中添加一个Appender,指定为JDBC类型。配置包括数据库连接信息(如URL、用户名、密码)、SQL语句(插入日志记录)等。 3. ...

    配置log4j配置数据库连接池(以dbcp连接池为例),并将log信息存储在数据库中(以mysql为例)

    本教程将详细介绍如何配置Log4j以使用DBCP连接池,并将日志信息存储到MySQL数据库中。 首先,我们需要在项目中引入Log4j和DBCP的相关依赖。对于Maven项目,可以在pom.xml文件中添加如下依赖: ```xml ...

    myBaits所有jar包,包括log4j所需jar包,mysql所需jar包,导入后可以直接使用

    在Java应用程序中,log4j允许开发者定义多个日志级别(如DEBUG、INFO、WARN、ERROR等),并决定在何时何地将这些日志信息写入不同的输出目的地,如控制台、文件、电子邮件或者syslog服务器。这个压缩包中的log4j jar...

    log4j 数据库,邮件,html 等配置

    Log4j允许我们直接将日志信息存储到数据库中,这对于需要长期保存和分析大量日志数据的系统来说尤其有用。首先,你需要配置一个Appender(输出端),例如使用JDBCAppender。在配置文件中,定义数据库连接参数,包括...

    eclipse + mybits 操作mysql数据库

    在Eclipse中,右键点击项目 -> "Build Path" -> "Configure Build Path" -> "Libraries" -> "Add External JARs",然后选择MyBatis的jar文件,包括mybatis-x.x.x.jar和mybatis-logging的相应实现(如log4j)。...

    JDBC批量插入 更新 删除等操作

    通过JDBC,Java应用程序可以与多种类型的数据库进行交互,实现数据的读取、写入等功能。批量操作是指在一次数据库连接中执行多次SQL语句的操作,这种方式能显著提高程序性能,尤其是在处理大量数据时。 **批量插入*...

    jdbc小例子

    在某些情况下,日志可能会被写入数据库,这需要配置Log4j以使用JDBC Appender。这将使日志信息存储在数据库表中,便于管理和分析。 配置Log4j使用JDBC Appender通常涉及以下步骤: a. 添加Log4j和JDBC相关的依赖...

    kettle(ETL工具)mysql 5.7 数据库的驱动包

    一旦配置完成,你就可以在Kettle的工作流或转换中创建步骤来读取、写入或操作MySQL数据库中的数据。这包括但不限于表输入、表输出、SQL步骤、JOIN步骤等,这些都极大地丰富了数据处理的可能性。 使用Kettle进行ETL...

    mysql集成包(5个)

    9. `commons-logging-1.2.jar`:Apache Commons Logging是日志服务的抽象层,允许开发者选择不同的日志实现,如Log4j或Java内置的日志API。在数据库操作中,日志记录对于调试和问题排查至关重要。 这些组件结合在...

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    在Java开发中,当需要向MySQL数据库大量插入数据时,使用JDBC的批量处理功能可以显著提高效率。本文将详细讲解如何使用JDBC批量插入10万条数据,并探讨其背后的原理和优化策略。 批量处理在JDBC中主要通过Statement...

    hive jdbc 连接所需要的jar包

    9. **slf4j-api*.jar** 和 **slf4j-log4j12*.jar**: 日志记录框架SLF4J和其适配器Log4j,用于记录Hive JDBC操作的日志信息。 10. **protobuf*.jar**: Protocol Buffers是Google的一种数据序列化协议,Hive可能用它...

Global site tag (gtag.js) - Google Analytics