业务异步写mysql数据库_把重要的业务日志异步批量写入数据库

1. 把重要的业务日志异步批量写入数据库

配置文件示例:

log4j.logger.business=INFO,db

log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender

log4j.appender.db.BufferSize=10

log4j.appender.db.URL=jdbc:hsqldb:res:/hsqldb/bookstore

log4j.appender.db.driver=org.hsqldb.jdbcDriver

log4j.appender.db.user=sa

log4j.appender.db.password=

log4j.appender.db.sql=INSERT INTO SS_LOG4J_LOG (PRIORITY,LOGDATE,CLASS,METHOD,MSG) VALUES('%p','%d{yyyy-MM-dd HH:mm:ss}','%C','%M','%m')

log4j.appender.db.layout=org.apache.log4j.PatternLayout

log4j提供了简单灵活且不影响性能的机制, 将重要业务日志写入数据库,方便日后的查询:

1. 建立一个任意命名的日志记录表,在log4j.properties里设置连接参数,根据刚才建的表名列名,编写插入的语句。

2. BufferSize=10 这样的参数可以让日志异步批量写入,不会影响系统性能。

3. 业务日志log最好不要用原来的package结构,而是在项目里协调一个独立的名字,如business。

Log buzzLog = LogFactory.getLog("business");

4. 以上功能的演示代码在bookstore example 的OrderManager.java,测试代码在bookstore example的DBLogTest.java。

2.Spring 对log4j的几个增强

个人建议都不要使用。

1. 定时刷新log4j properties文件,无须重启服务器Apply 新的log4j设置。

虽然这是个J2EE Best Practice,但在Spring的JavaDoc里注明了不推荐用于生产环境,因为服务器重启的时候,那条watch thread 不会关闭。

2.将log4j.properties 文件放在WEB-INF/log4j.properties。

这种增强看不出有什么好处,而且如果放WEB-INF,测试的时候就不能输出log4j信息了,除非像Appfuse那样把WEB-INF也设为class path,不过这种设法只适用于Ant脚本的情况。

3. 通过设定{web.root} 这样的系统变量,将log文件放到项目的WEB-INF目录中

log4j.appender.logfile.File=${bookstore.root}/WEB-INF/logs/bookstore.log

这样做的好处是路径比较稳定,但如果是war式的部署,每次重新部署的时候就会把原来的log文件全部删掉,遇上jboss 这种不解压war包的应用服务器就更会出错,所以把log文件放WEB-INF/logs不是一个好的选择。

其实logfile路径的规则是,如果不是绝对路径,就以应用运行的目录作为相对路径的根目录。

所以我平时这样定义,一般就指向tomcat 和很多应用服务器的logs目录:

log4j.appender.logfile.File=../logs/bookstore.log

这样的缺点是,假设你把Tomcat/bin目录添加到了PATH变量的值中去,并喜欢从Windows开始菜单的运行框里输入"startup.bat"启动Tomcat,这时Log4j的日志就会被放到C:\Documents And Settings\logs目录中去。

3. 忽略某些类库框架的不必要的信息

控制第三方框架类库的logging level,可以避免满屏都是不重要的info,把真正重要的信息掩盖了。

# Changing the log level to DEBUG when debug

log4j.logger.org.springframework=WARN

# Changing the log level to DEBUG will display SQL Hibernate generated

log4j.logger.org.hibernate=WARN

log4j.logger.org.hibernate.SQL=ERROR

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2008-11-17 09:40

浏览 1982

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 PHP 中实现异步写入数据库可以使用以下两种方法: 1. 使用 Swoole 扩展 Swoole 是一个高性能的异步网络通信框架,可以用来实现异步写入数据库。以下是一个简单的示例代码: ```php $server = new swoole_server("127.0.0.1", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); $server->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, "hello\n"); $serv->after(1000, function () use ($fd) { $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'password'); $dbh->exec("INSERT INTO `test` (`name`) VALUES ('test')"); $dbh = null; $serv->send($fd, "world\n"); }); }); $server->start(); ``` 2. 使用 MySQLi 的异步 API MySQLi 是 PHP 的一个扩展库,它提供了异步 API,可以用来实现异步写入数据库。以下是一个简单的示例代码: ```php $mysqli = new mysqli("127.0.0.1", "root", "password", "test", 3306, null, MYSQLI_ASYNC); $mysqli->query("INSERT INTO `test` (`name`) VALUES ('test')", MYSQLI_ASYNC); $links = [$mysqli]; $wait_for = null; $wait_timeout_sec = 1; $wait_timeout_usec = 0; do { $result = mysqli_poll($links, $wait_for, $wait_timeout_sec, $wait_timeout_usec); if ($result === false) { echo "Error: " . mysqli_error($mysqli); break; } elseif ($result > 0) { $result = $mysqli->reap_async_query(); var_dump($result); break; } } while (true); ``` 需要注意的是,使用 MySQLi 异步 API 需要开启 MySQLi 的异步模式,而且只有在 PHP 编译时开启了 mysqli 模块的异步支持才能使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值