收集缓存中的数据并写入数据库

时间:2011-10-03 18:39:35

标签: java caching

我需要一些缓存帮助。

这是我的要求:

我的应用程序每天有数百万次点击。目前,我使用直接数据库插入记录日志表中的会话和事务日志等信息,这会降低应用程序的性能。

我想要这样的东西:我使用一些缓存机制,它应该每次点击收集数据。我将它写入一个文件,一旦文件中包含1000条记录,缓存中的这些条目应该作为一个批次进入数据库。(后面写的会很好)。

有人可以帮忙解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

解决方案:将log4j与AsynAppender和JDBCAppender一起使用。

您可以在log4j.xml中配置AsynAppender的缓冲区大小。然后,当缓冲区已满时,它将使用JDBCAppender刷新数据库中的所有内容。

例如:

    <appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
     ....
     your DB CONFIG


    <appender name="PerfAppender" class="org.apache.log4j.AsyncAppender">
    <param name="BufferSize" value="5000" />
    <appender-ref ref="DB" />
</appender>

通过这种方式,它可以完成您所描述的内容,甚至不需要编写一行代码;-)差不多......

更多详情:

您可以使用log4J的MDC来保存数据。 MDC基本上是一个hashmap,您可以在其中存储要记录的数据(键,值)。然后在log4j.xml中,您可以使用%X访问MDC中的数据。

例如:

<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
<param name="URL" value="yoururlconnection" />

<param name="Driver" value="com.ibm.db2.jcc.DB2Driver" />
<param name="User" value="myuser" />

<param name="Password" value="mypassord" />
<layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern"        
         value="INSERT INTO mytable (field1, field2, etc) VALUES
                    ('%X{value1}', '%X{value2}', etc)" />
        </layout>
</appender>

答案 1 :(得分:0)

肯定会有一个memcached的Java接口来解决这个问题。在您的日志代码中,只需添加项目即可记录到memcached,然后每个X记录一次性写入它们。

实际上,您可以在单独的进程中进行批量写入,因此其命中包含缓存写入的用户不会遇到额外的延迟。