我需要一些缓存帮助。
这是我的要求:
我的应用程序每天有数百万次点击。目前,我使用直接数据库插入记录日志表中的会话和事务日志等信息,这会降低应用程序的性能。
我想要这样的东西:我使用一些缓存机制,它应该每次点击收集数据。我将它写入一个文件,一旦文件中包含1000条记录,缓存中的这些条目应该作为一个批次进入数据库。(后面写的会很好)。
有人可以帮忙解决这个问题吗?
答案 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记录一次性写入它们。
实际上,您可以在单独的进程中进行批量写入,因此其命中包含缓存写入的用户不会遇到额外的延迟。