在Hibernate,EhCache,Quartz,DBCP和Spring中启用JMX

继续使用JMX的过程(请参阅: 人类JMX ),我们将学习如何在一些流行的框架中启用JMX支持(通常是统计和监视功能)。 这些信息大部分都可以在项目的主页上找到,但是我决定在收集这些信息的同时,很少添加一些有用的提示。

休眠(带有Spring支持)
使用JMX公开Hibernate统计信息非常简单 ,但是当使用JPA API获取基础SessionFactory时,需要一些讨厌的解决方法

class JmxLocalContainerEntityManagerFactoryBean() extends LocalContainerEntityManagerFactoryBean {override def createNativeEntityManagerFactory() = {val managerFactory = super.createNativeEntityManagerFactory()registerStatisticsMBean(managerFactory)managerFactory}def registerStatisticsMBean(managerFactory: EntityManagerFactory) {managerFactory match {case impl: EntityManagerFactoryImpl =>val mBean = new StatisticsService();mBean.setStatisticsEnabled(true)mBean.setSessionFactory(impl.getSessionFactory);val name = new ObjectName("org.hibernate:type=Statistics,application=spring-pitfalls")ManagementFactory.getPlatformMBeanServer.registerMBean(mBean, name);case _ =>}}}

请注意,我已经创建了Springs内置LocalContainerEntityManagerFactoryBean的子类。 通过重写createNativeEntityManagerFactory()方法,我可以访问EntityManagerFactory并尝试将其向下转换为org.hibernate.ejb.EntityManagerFactoryImpl我们能够注册Hibernate Mbean。

还有一件事。 显然,我们必须使用自定义子类而不是org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 。 另外,为了收集实际的统计信息,而不是一直看到零,我们必须设置hibernate.generate_statistics标志。

@Bean
def entityManagerFactoryBean() = {val entityManagerFactoryBean = new JmxLocalContainerEntityManagerFactoryBean()entityManagerFactoryBean.setDataSource(dataSource())entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter())entityManagerFactoryBean.setPackagesToScan("com.blogspot.nurkiewicz")entityManagerFactoryBean.setJpaPropertyMap(Map("hibernate.hbm2ddl.auto" -> "create","hibernate.format_sql" -> "true","hibernate.ejb.naming_strategy" -> classOf[ImprovedNamingStrategy].getName,"hibernate.generate_statistics" -> true.toString).asJava)entityManagerFactoryBean
}

这是我们希望在JvisualVM中看到的示例(不要忘记安装所有插件!):

另外,我们获得了一个不错的Hibernate日志记录:

HQL: select generatedAlias0 from Book as generatedAlias0, time: 10ms, rows: 20

高速缓存

监视缓存非常重要,尤其是在您希望在那里通常存在值的应用程序中。 我倾向于根据需要频繁查询数据库,以避免不必要的方法参数或本地缓存 。 一切使代码尽可能简单。 但是,这种方法仅在数据库层上的缓存正常工作时才有效。 与Hibernate相似,在EhCache中启用JMX监视是一个两步过程。 首先,您需要在MBeanServer公开提供的MBean

@Bean(initMethod = "init", destroyMethod = "dispose")
def managementService = new ManagementService(ehCacheManager(), platformMBeanServer(), true, true, true, true, true)@Bean def platformMBeanServer() = ManagementFactory.getPlatformMBeanServerdef ehCacheManager() = ehCacheManagerFactoryBean.getObject@Bean def ehCacheManagerFactoryBean = {val ehCacheManagerFactoryBean = new EhCacheManagerFactoryBeanehCacheManagerFactoryBean.setShared(true)ehCacheManagerFactoryBean.setCacheManagerName("spring-pitfalls")ehCacheManagerFactoryBean
}

请注意,我明确设置了CacheManager名称。 这不是必需的,但是此名称用作Mbean名称的一部分,并且默认名称包含hashCode值,这不是很好。 最后一点是启用基于缓存的统计信息:

<cache name="org.hibernate.cache.StandardQueryCache"maxElementsInMemory="10000"eternal="false"timeToIdleSeconds="3600"timeToLiveSeconds="600"overflowToDisk="false"memoryStoreEvictionPolicy="LRU"statistics="true"
/>

现在,我们可以愉快地分别监视每个缓存的各种缓存特征:

如我们所见,缓存未命中的百分比增加了。 从来没有一件好事。 如果我们不启用缓存统计信息,那么启用JMX仍然是一个好主意,因为我们免费获得了许多管理操作,包括刷新和清除缓存(在调试和测试过程中很有用)。

石英调度器

以我的拙见, Quartz Scheduler是一个被低估的库,但是我将自己撰写一篇有关它的文章。 这次,我们将仅学习如何通过JMX对其进行监视。 幸运的是,它就像添加一样简单:

org.quartz.scheduler.jmx.export=true

quartz.properties文件。 Quartz中对JMX的支持可能会稍微扩大一点,但是仍然可以查询例如当前正在运行的作业。 顺便说一下,新的主要版本的Quartz(2.x)带来了非常好的DSL类似的调度支持:

val job = newJob(classOf[MyJob])
val trigger = newTrigger().withSchedule(repeatSecondlyForever()).startAt(futureDate(30, SECOND))
scheduler.scheduleJob(job.build(), trigger.build())

Apache Commons DBCP

Apache Commons DBCP是我遇到的最合理的JDBC池库。 还有c3p0 ,但似乎不再积极开发了。 Tomcat JDBC连接池看起来很有前途,但是由于它捆绑在Tomcat中,因此您的JDBC驱动程序不能再打包在WAR中。

DBCP的唯一问题是它不支持JMX。 完全没有(请参见此两年半的旧版 )。 幸运的是,这很容易解决。 此外,我们还将学习如何使用Spring内置的JMX支持。

看起来标准的BasicDataSource拥有我们所需的全部,我们要做的就是通过JMX公开现有的指标。 使用Spring时,它简直就是简单–只需@ManagedAttribute子类,然后在所需的属性上添加@ManagedAttribute批注:

@ManagedResource
class ManagedBasicDataSource extends BasicDataSource {@ManagedAttribute override def getNumActive = super.getNumActive@ManagedAttribute override def getNumIdle = super.getNumIdle@ManagedAttribute def getNumOpen = getNumActive + getNumIdle@ManagedAttribute override def getMaxActive: Int= super.getMaxActive@ManagedAttribute override def setMaxActive(maxActive: Int) {super.setMaxActive(maxActive)}@ManagedAttribute override def getMaxIdle = super.getMaxIdle@ManagedAttribute override def setMaxIdle(maxIdle: Int) {super.setMaxIdle(maxIdle)}@ManagedAttribute override def getMinIdle = super.getMinIdle@ManagedAttribute override def setMinIdle(minIdle: Int) {super.setMinIdle(minIdle)}@ManagedAttribute override def getMaxWait = super.getMaxWait@ManagedAttribute override def setMaxWait(maxWait: Long) {super.setMaxWait(maxWait)}@ManagedAttribute override def getUrl = super.getUrl@ManagedAttribute override def getUsername = super.getUsername
}

以下是一些在负载测试期间疯狂的数据源指标:

Spring框架本身对JMX的支持非常简单。 如您所见,公开任意属性或操作只是添加注释的问题。 您只需要记住有关使用XML或Java启用JMX支持的方法(另请参见: SPR-8943:等效于<context:mbean-export />的@Configuration ):

<context:mbean-export/>

要么:

@Bean def annotationMBeanExporter() = new AnnotationMBeanExporter()

这篇文章并不特别令人兴奋。 但是,对JMX指标的了解将使我们能够立即编写简单而精致的仪表板。 敬请关注!

参考: Java和社区博客上的JCG合作伙伴 Tomasz Nurkiewicz提供了在Hibernate,EhCache,Quartz,DBPC和Spring中启用JMX的信息 。

相关文章 :

  • 使用Spring将POJO公开为JMX MBean
  • 休眠陷阱
  • DataNucleus 3.0与Hibernate 3.5
  • Spring 3.1和Hibernate的持久层
  • 使用Spring和Java泛型简化数据访问层
  • Spring 3.1和JPA的持久层

翻译自: https://www.javacodegeeks.com/2012/01/enabling-jmx-in-hibernate-ehcache-qurtz.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

400多万微信用户如何“变现”?凯叔说了五大秘诀与教训

凯叔&#xff0c;原名王凯&#xff0c;自媒体“凯叔讲故事”创始人&#xff0c;近日在狮享家班委会上做了分享&#xff0c;全是实实在在的实验性方法论。以下是王凯的分享内容&#xff0c;整理 / 垅青 我讲的主题叫“基于内容的MVP探索”&#xff0c;MVP是什么东西&#xff1f;…

使用模拟的单元测试–测试技术5

我的最后一个博客是有关测试代码方法的一系列博客中的第四篇&#xff0c;演示了如何创建使用存根对象隔离测试对象的单元测试。 今天的博客探讨了有时被视为对立的技术&#xff1a;使用模拟对象进行单元测试。 同样&#xff0c;我使用了从数据库检索地址的简单方案&#xff1a;…

多线程中的volatile和伪共享

伪共享 false sharing&#xff0c;顾名思义&#xff0c;“伪共享”就是“其实不是共享”。那什么是“共享”&#xff1f;多CPU同时访问同一块内存区域就是“共享”&#xff0c;就会产生冲突&#xff0c;需要控制协议来协调访问。会引起“共享”的最小内存区域大小就是一个cache…

C语言代码规范(一)缩进与换行

一、缩进的空格数为4个。最好配置代码编辑器将TAB键设置为空格替换&#xff0c;避免出现另一个编辑器打开时格式变乱的情况。 例如Notepad设置 KEIL设置 二、“{” 和 “}”各自独占一行。 不规范例子&#xff1a; for(i 0; i < student_num; i) { if((score[i] > 0…

armv7 cortex a系列编程手册_AWTK能为现代GUI编程带来何种改变?

AWTK是一个伸缩性极强的嵌入式图形框架&#xff0c;它的诞生会给GUI编程研发工程师带来哪些改变&#xff1f;AWTK是一个伸缩性极强的嵌入式图形框架&#xff0c;可在Cortex-M3这样低端的单片机上运行&#xff0c;也可以在Cortex-A7/A8/A9等处理器&#xff0c;甚至DSP以及X86处理…

为什么要编写单元测试–测试技巧8

我对最近在“您应该测试什么”上的博客有很多反应&#xff0c;有些人出于各种原因同意我的想法&#xff0c;另一些人则认为建议某些类可能不需要单元测试是非常危险的。 已经处理了什么测试&#xff0c;今天的博客涉及为什么要编写单元测试&#xff0c;而今天的示例代码是基于一…

c++ 多重背包状态转移方程_动态规划入门——详解经典问题零一背包

本文始发于个人公众号&#xff1a;TechFlow&#xff0c;原创不易&#xff0c;求个关注今天是周三算法与数据结构专题的第12篇文章&#xff0c;动态规划之零一背包问题。在之前的文章当中&#xff0c;我们一起探讨了二分、贪心、排序和搜索算法&#xff0c;今天我们来看另一个非…

python定义一个圆_Python-矩形和圆形

原博文 2019-11-11 12:34 − Exercise 15.1. 定义一个叫做Circle 类&#xff0c;类的属性是圆心 (center) 和半径 (radius) , 其中&#xff0c;圆心 (center) 是一个 Point 类&#xff0c;而半径 (radius) 是一个数字。 实例化一个圆心 (center) 为 (150, 100) &#xff0c;半…

STM32F1笔记(一)GPIO输出

GPIO&#xff1a;General Purpose Input Output &#xff08;通用输入/输出&#xff09;。 GPIO最经典应用&#xff1a;LED灯。 先看电路。声明&#xff1a;参考正点原子战舰开发板。 与LED串联的电阻称为限流电阻。 限流电阻计算公式&#xff1a;R(U-LED压降)/20ma。 U为LE…

dataframe转化为array_【Python专栏】12 种高效 Numpy 和 Pandas 函数为你加速分析

来源&#xff1a;机器之心编译&#xff1a;Jamin、杜伟、张倩我们都知道&#xff0c;Numpy 是 Python 环境下的扩展程序库&#xff0c;支持大量的维度数组和矩阵运算&#xff1b;Pandas 也是 Python 环境下的数据操作和分析软件包&#xff0c;以及强大的数据分析库。二者在日常…

具有GlassFish和一致性的高性能JPA –第1部分

您以前听说过连贯性吗&#xff1f; 大概是。 它是那些著名的内存网格解决方案之一&#xff0c;该解决方案承诺了超快的数据访问速度和对经常使用的数据的无限空间。 一些众所周知的竞争对手是Infinispan &#xff0c; Memcached和Terracotta Ehcache 。 它们都很棒&#xff0c;…

boost原理与sklearn源码_机器学习sklearn系列之决策树

一、 Sklearn库 Scikit learn 也简称 sklearn, 自2007年发布以来&#xff0c;scikit-learn已经成为Python重要的机器学习库了。支持包括分类、回归、降维和聚类四大机器学习算法。还包含了特征提取、数据处理和模型评估三大模块。sklearn是Scipy的扩展&#xff0c;建立在NumPy和…

STM32F1笔记(二)GPIO输入

STM32 GPIO输入的经典应用是按键。 先看电路。声明&#xff1a;参考正点原子战舰开发板。 在这里可以看到&#xff0c;KEY_UP按键是高电平有效的&#xff0c;即当按下该按键时&#xff0c;GPIO读到高电平。 KEY0/1/2是低电平有效的&#xff0c;即当按下该按键时&#xff0c;G…

STM32F1笔记(三)UART/USART

UART&#xff1a;Universal Asynchronous Receiver/Transmitter&#xff08;通用异步收/发器&#xff09; USART&#xff1a;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff08;通用同步/异步串行收/发器&#xff09; 从命名即可看出USART就是UART的基础上…

python安装界面翻译_python环境搭建

如果想要运行python需要有解释器和编辑器。 什么是解释器 解释器我们可以把它理解成翻译官&#xff0c;它是将我们写的python代码翻译成计算机能够懂得机器语言。 然后计算机收到解释器的命令来干活&#xff0c;最终再将结果反馈在解释器中。 解释器推荐使用anaconda3 什么是an…

进阶篇-用户界面:4.Android中常用组件

1.下拉菜单 在Web开发中&#xff0c;HTML提供了下拉列表的实现&#xff0c;就是使用<select>元素实现一个下拉列表&#xff0c;在其中每个下拉列表项使用<option>表示即可。这是在Web开发中一个必不可少的交互性组件&#xff0c;而在Android中的对应实现就是Spinne…

http的“无连接”指的是_http协议无状态中的 quot;状态quot; 到底指的是什么?...

引子&#xff1a;最近在好好了解http&#xff0c;发现对介绍http的第一句话【http协议是无状态的&#xff0c;无连接的】就无法理解了&#xff1a;无状态的【状态】到底指的是什么&#xff1f;&#xff01;找了很多资料不仅没有发现有一针见血正面回答这个问题的&#xff0c;而…

个人日志-7.4

姓名 刘鑫 时间 2016.7.4 学习内容 完善需求分析报告。撰写数据库设计说明书。初步安排计划概要设计说明书。调整项目开发计划说明书。 所遇问题 无 解决方案 无 转载于:https://www.cnblogs.com/liuxin13070013/p/5641967.html

STM32F1笔记(五)外部中断EXTI

STM32的每个IO都可以作为外部中断的中断输入口。 STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为&#xff0c;每个中断/事件都有独立的触发和屏蔽设置。 STM32F103的19个外部中断为&#xff1a; EXTI线0~15&#xff1a;对应外部IO口的输入中断。 EXT…

STM32F1笔记(六)独立看门狗IWDG

STM32F1内置了两个看门狗&#xff0c;独立看门狗IWDG和窗口看门狗WWDG&#xff0c;可以用来检测和解决由软件错误引起的故障。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外&#xff0c;能够完全独立工作&#xff0c;并且对时间精度要求较低的场合。WWDG最适合那些要求…