霍肖和乔洛基亚的冬眠统计


企业Java的很大一部分处理数据。在企业环境中处理数据的所有不同方法中,仍然有一种经过验证并被广泛教授的方法来使用任何类型的操作/响应映射。JPA标准使这一点对每个人来说都相对容易使用,并且它也应该是便携式的。但是我们不要谈论迁移细节。操作/响应映射的最大缺点是,开发人员往往会失去与数据库中正在发生的事情的联系,甚至会失去对数据库发出的确切的SQL语句的联系。这是这些项目遇到性能问题的首要原因。如果你在那里,你需要分析根本原因,深入到问题。我最近发现了Hibernate的一个很好的特性,这使得这个比较容易。

可用的统计数据和获取它们的方法。

hibernate 3.5 . x附带了一个统计和度量应用编程接口,它允许您了解很多关于幕后发生的事情。中描述了所有可用的计数器Statistics interface API,分为三类:

  • 与一般会话使用情况相关的指标,如打开会话的数量、检索到的JDBC连接等。
  • 与实体、集合、查询和缓存作为一个整体相关的度量(也称为全局度量)。
  • 与特定实体、集合、查询或缓存区域相关的详细指标。

例如,您可以检查实体、集合和查询的缓存命中、未命中和放置比率,以及查询所需的平均时间。请注意,毫秒数在Java中是近似的。Hibernate与JVM精度有关,在某些平台上,这可能只精确到10秒。

简单获取器用于访问全局度量(即,不绑定到特定的实体、集合、缓存区域等)。)。您可以通过特定实体、集合或缓存区域的名称以及查询的HQL或SQL表示来访问其度量。请参考统计数据,EntityStatistics,CollectionStatistics,SecondLevelCacheStatistics,和QueryStatistics 有关更多信息,请参见API Javadoc。

您所要做的就是为您感兴趣的会话工厂启用统计数据,并检索统计数据以进行分析。有很多例子说明如何在Spring中使用这个特性。原因很简单:Spring附带了一个传奇的MBeanExporter,它将JMX mbean公开为Java对象。猜猜看:Hibernate Statistics提供了一种通过JMX展示它们的简单方法。但是,如果您只是添加了一些红帽魔法,就没有必要使用Spring了:)

在您配置的设置中,基本上有两种不同的方式来启用统计信息。最简单的方法是向您的持久性单元配置添加一个属性:

   <property name="hibernate.generate_statistics" value="true"/>

但是也可以手动启用它们。有关如何做到这一点的更多详细信息,请访问community wiki和中的性能监控部分Hibernate documentation

通过示例启用和公开统计信息

我创建了一个独立的hibernate应用程序的小例子,它有两个实体和一个主类,主类使用Hibernate并初始化您需要知道的一切。马上拿到它forking it on GitHub。这是一个简单的介绍:

有两个强制实体(部门和雇员)和元信息/持久性。这里没有什么魔法。您可以在中查看在何处启用统计信息(可能)persistence.xml。该示例在主类中启用它们JpaTest。但是让我们从头开始。主方法按顺序执行以下步骤:

  1. 创建要使用的实体管理器。
  2. 注册我们需要的统计数据。
  3. 初始化Jolokia服务器,通过JSON为Hawtio公开JMX
  4. 对实体做些什么。

魔法从第二步开始,这是在registerHibernateMBeans(实体管理器)方法中。它获得平台服务器,注册相关的Hibernate JMX Mbean,设置我们感兴趣的会话工厂,并启用统计。那很简单。现在您有了一个注册了属性“统计”的JMX MBean“休眠”。如果您可以通过JConsole或任务控制或VisualVM访问服务器,您只需连接到该流程并浏览统计数据:


在JConsole中休眠MBean

在生产环境中,这通常根本不可能。因此,您需要找到一种通过http/https访问它的方法。这是我觉得方便尝试的地方Hawtio作为一个模块化的网络控制台来管理您的Java内容。这是一个带有插件的网络控制台。它有一个ton of plugins并且可以根据您的需求进行定制和扩展。今天我们来看一个非常简单的插件,即JMX plugin。它为您提供了底层JMX度量数据的原始视图,允许您访问MBeans的整个JMX域树。但是为了实现这一点,我们首先需要找到一种方法向霍肖展示JMX的特色。这是哪里Jolokia进来。有一个JVM agent谁能通过JSON揭露JMX分子。您只需初始化并启动服务器,如下所示:

JolokiaServerConfig config = new JolokiaServerConfig(new HashMap<String, String>());
JolokiaServer jolokiaServer = new JolokiaServer(config, true);
jolokiaServer.start();

现在,您已经准备好试用Hawtio控制台了。看看这个quickstart 看看什么是可能的。在这个例子中,我只使用谷歌浏览器扩展,你只需要下载它,并把它拖到你浏览器的扩展页面上。这看起来像:

铬合金中的山楂延伸

如果您配置了“localhost”、“8778”和“jolokia”路径,您就可以开始浏览结果了。单击“连接”后,您可以查看仪表板或切换到JMX视图,并导航到Hibernate MBean:


和霍肖一起浏览JMX博物馆

《发展2014》中斯坦·刘易斯对霍肖有一个更全面的介绍,等着你来看:

这是一个简短的例子。继续,看看GitHub的源代码,并随意多看看Hawtio: