我在缓存方面需要帮助。

这是我的要求:

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

我想要类似的东西:我使用某种缓存机制,该机制应按每次匹配收集数据。我将其写入文件,一旦文件包含可以说的1000条记录,那么来自缓存的这些条目应作为一个批处理转到数据库中。

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

最佳答案

解决方案:将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基本上是一个哈希图,您可以在其中存储要记录的数据(键,值)。然后,您可以在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>

10-06 16:01
查看更多