Java 在缓存中收集数据并写入数据库

Java 在缓存中收集数据并写入数据库,java,caching,Java,Caching,我需要一些缓存方面的帮助 以下是我的要求: 我有一个应用程序,每天有数以百万计的点击率。目前,我正在使用直接db插入将会话和事务日志等信息记录在日志表中,这会降低应用程序的性能 我想要这样的东西:我使用一些缓存机制,它应该收集每次命中的数据。我将把它写入一个文件,一旦该文件包含1000条记录,缓存中的这些条目将作为一个单独的批处理进入数据库(最好是写在后面) 一些人可以帮助解决这个问题吗?解决方案:使用带有Asynapender和JDBCAppender的log4j 您可以在log4j.xml中

我需要一些缓存方面的帮助

以下是我的要求:

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

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


一些人可以帮助解决这个问题吗?

解决方案:使用带有Asynapender和JDBCAppender的log4j

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

例:


....
您的数据库配置
这样,它可以按照您所描述的做,您甚至不必编写一行代码;-)几乎

更多详情:

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

例:


解决方案:使用带有asynapender和jdbcapender的log4j

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

例:


....
您的数据库配置
这样,它可以按照您所描述的做,您甚至不必编写一行代码;-)几乎

更多详情:

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

例:


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


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

肯定有一个到memcached的Java接口可以解决此问题。在您的日志代码中,只需将要记录的项添加到memcached中,然后每X条记录一次性将它们全部写入


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

这是的重复吗?Stackoverflow的协议不是重新提问,而是对问题进行编辑以使其更好。这个问题与Ehcache有关。但我认为我的要求可能无法用这个框架实现,所以我把它作为新问题发布,以获取更多的想法和建议。这是一个重复的吗?Stackoverflow的协议不是重新提问,而是对问题进行编辑以使其更好。这个问题与Ehcache有关。但我认为我的需求可能无法用这个框架实现,所以我把它作为新问题发布,以获取更多的想法和建议。这种方法是否有助于在JVM崩溃中生存?如何使用这种方法保存数据?在我的回答中添加了详细信息。我不知道JVM崩溃!!!但是您可以使用asynapender->jdbcapender持久化使用log4j收集的数据。AsyncAppender不会影响性能,因为它是异步的。在关闭日志记录的生产环境中,这种方法对我没有帮助。有没有其他缓存机制可以实现这一点?可能,但我从未实现过。我已经实现了log4j方法,效果非常好。我不明白为什么在prod中关闭日志记录。。。通常的做法是将日志级别提高到其他级别,然后进行调试,以避免记录太多内容。但完全禁用它有点极端;-)这种方法是否有助于在JVM崩溃中生存?如何使用这种方法保存数据?在我的回答中添加了详细信息。我不知道JVM崩溃!!!但是您可以使用asynapender->jdbcapender持久化使用log4j收集的数据。AsyncAppender不会影响性能,因为它是异步的。在关闭日志记录的生产环境中,这种方法对我没有帮助。有没有其他缓存机制可以实现这一点?可能,但我从未实现过。我已经实现了log4j方法,效果非常好。我不明白为什么在prod中关闭日志记录。。。通常的做法是将日志级别提高到其他级别,然后进行调试,以避免记录太多内容。但完全禁用它有点极端;-)依我所见
    <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>
<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>