【问题标题】:How to implement Java/Scala in-memory statistics database?如何实现 Java/Scala 内存统计数据库?
【发布时间】:2011-05-25 05:38:56
【问题描述】:

我需要汇总 Web 应用程序服务器的实时统计信息。 例如:

  • 已完成多少内容类型 X 的请求
  • 处理Y类型的请求需要多长时间

等等。

为了获得最佳性能,此数据必须完全位于内存中,而不是文件中。它不会记录每个请求,而是只存储各个方面的计数器。

我知道的最简单的方法是将值存储在类似 SQL 的表中并执行类似 SQL 的查询。好处是索引是现成的,无需开发工作。我想像Apache Derby 这样的一些嵌入式Java 数据库可以完成这项工作。

另一种方法是为每个“索引列”实现集合(比如列表)和哈希表。这样一来,一切都是用 Java/Scala 集合 API 完成的,但实际上我必须自己实现索引机制,测试它,维护它等等。

所以我的问题是您认为哪种方式更受欢迎,是否有其他方式可以轻松快速地实现此功能?

谢谢。

【问题讨论】:

  • 我刚刚发现了 RRDtool。我想知道这是否是首选的方式,而不是重新发明轮子。还有称为 rrd4j (rrd4j.dev.java.net) 的 Java 实现

标签: java sql statistics embedded-database


【解决方案1】:

我会选择H2 database,我对它有非常积极的体验,性能也很棒。

您确定 SQL 数据库非常适合您的需求吗?您是否查看过javamelody,看看它是否适合您的需求,或者如果它不适合您,请查看JRobin 进行滚动数据库实现。

【讨论】:

    【解决方案2】:

    我想你需要收集的每种信息类型只需要一个集合。为了提高性能,简化代码我会使用 TObjectIntHashMap。例如

    已经完成了多少内容类型 X 的请求

    TObjectIntHashMap<ContentType> contentTypeCount 
         = new TObjectIntHashMap<ContentType>();
    
    contentTypeCount.increment(contentType); 
    

    处理Y类型的请求需要多长时间

    TObjectLongHashMap<ProcessType> contentTypeTime 
        = new TObjectLongHashMap<ProcessType>();
    
    contentTypeTime.adjustValue(processType, processTime);
    

    我不明白如何通过使用您提到的其他方法使其更短/更简单/更快。

    在我的机器上执行增量(键)的平均时间需要 15 ns(十亿分之一秒)

    【讨论】:

      【解决方案3】:

      我还注意到Twitter Ostrich,它是 Scala 的统计库。

      它包含计数器、仪表和计时表。

      可从 HTTP REST API 访问数据。

      【讨论】:

        猜你喜欢
        • 2011-07-23
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 2017-08-08
        相关资源
        最近更新 更多