【问题标题】:Collect data in cache and writing to database在缓存中收集数据并写入数据库
【发布时间】:2011-10-03 18:39:35
【问题描述】:

我在缓存方面需要一些帮助。

这是我的要求:

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

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

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

【问题讨论】:

  • 这是your previous question 的副本吗? Stackoverflow 上的协议不是重新提出问题,而是编辑它们以使它们变得更好。
  • 那个问题与 Ehcache 有关。但我认为使用该框架可能无法满足我的要求,因此我将其发布为新问题以获取更多想法和建议。

标签: java caching


【解决方案1】:

解决方案:将 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>

【讨论】:

  • 这种方法是否有助于在 JVM 崩溃中幸存下来?我如何保存这种方法的数据?
  • 在我的回复中添加了详细信息。我不知道JVM崩溃!但是您使用 asynAppender->JDBCAppender 持久化使用 log4j 收集的数据。 AsyncAppender 不会影响性能,因为它是异步的。
  • 这种方法在日志将被关闭的生产环境中对我没有帮助。有没有其他缓存机制来实现这一点?
  • 可能,但我从未实现过。我已经实现了 log4j 方法并且效果很好。我不明白为什么在 prod 中关闭日志记录...通常的做法是将日志级别提高到除 DEBUG 之外的其他值,以避免记录太多内容。但是完全禁用它有点过激;-) IMO
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多