在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.pswp.cn/news/374452.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374452.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374452.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二叉樹遍歷(前中后)

二叉樹前序遍歷&#xff1a; /*** Definition for binary tree* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vector<int> preorderTravers…

python語言程序設計實踐教程答案實驗六_Python程序設計實踐教程

書名&#xff1a;Python程序設計實踐教程 定價&#xff1a;29.8 ISBN&#xff1a;9787115532602 作者&#xff1a;儲岳中 薛希玲 版次&#xff1a;*1版 出版時間&#xff1a;2020-04 內容提要&#xff1a; 本書是Python語言程序設計的配套實踐教材&#xff0c;分為三部分&#…

400多萬微信用戶如何“變現”?凱叔說了五大秘訣與教訓

凱叔&#xff0c;原名王凱&#xff0c;自媒體“凱叔講故事”創始人&#xff0c;近日在獅享家班委會上做了分享&#xff0c;全是實實在在的實驗性方法論。以下是王凱的分享內容&#xff0c;整理 / 垅青 我講的主題叫“基于內容的MVP探索”&#xff0c;MVP是什么東西&#xff1f;…

使用dbUnit,JSON,HSQLDB和JUnit規則進行數據庫單元測試

在本周TDD課程的運行中&#xff0c;我認為編寫一些夾具以簡化dbUnit的使用將很有趣。 我最初的想法只是教dbUnit有關JSON的知識&#xff0c;但事實證明Lieven Doclo已經做到了。 因此&#xff0c;我決定更進一步&#xff0c;還將dbUnit與JUnit Rules結合起來&#xff0c;并提供…

Codeforces Round #321 (Div. 2) E. Kefa and Watch 線段樹hash

E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 題目連接 http://codeforces.com/contest/580/problem/EDescription One day Kefa the parrot was walking down the street as he was on the way home from the restaurant when he saw something glittering by…

python文字游戲源代碼求年紀_Python實現猜年齡游戲代碼實例

1. 在猜年齡的基礎上編寫登錄、注冊方法&#xff0c;并且把猜年齡游戲分函數處理&#xff0c;如 2. 登錄函數 3. 注冊函數 4. 猜年齡函數 5. 選擇獎品函數 代碼如下 import json real_age 18 prize_list [好迪洗發水, 綠箭俠, 小豬佩奇, 布娃娃, 再來一次!] import random us…

KVC 與 KVO

一、Key-Value Coding (KVC)鍵值編碼 KVC&#xff0c;即是指 NSKeyValueCoding&#xff0c;一個非正式的 Protocol&#xff0c;提供一種機制來間接訪問對象的屬性。KVO 就是基于 KVC 實現的關鍵技術之一。 一個對象擁有某些屬性。比如說&#xff0c;一個 Person 對象有一個 nam…

使用模擬的單元測試–測試技術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處理…

【轉】各種概念POJO、JAVABEAN、DAO、DTO、PO、VO、BO、SSH、EJB

POJO&#xff08;pure old java object&#xff09; 是普通java類&#xff0c;有一些private的參數作為對象的屬性&#xff0c;然后針對每一個參數定義get和set方法訪問的接口。我看到這個定義&#xff0c;心里就有個疑問了&#xff0c;這個POJO跟JavaBean的定義怎么就這么像&a…

為什么要編寫單元測試–測試技巧8

我對最近在“您應該測試什么”上的博客有很多反應&#xff0c;有些人出于各種原因同意我的想法&#xff0c;另一些人則認為建議某些類可能不需要單元測試是非常危險的。 已經處理了什么測試&#xff0c;今天的博客涉及為什么要編寫單元測試&#xff0c;而今天的示例代碼是基于一…

Git遷移 從SVN到Git

Migrating from SVN to Git 首先我們需要在Stach或者GitHub上新建一個Repository, 拿到它的URL。 接下來參照如下步驟 : At first we should create a new git repository at Stash and get the repository URL, and then follow below steps: 1. 切換到本地git工作目錄 chang…

C語言代碼規范(二)空格

一、逗號, 之后加空格 printf("error! score[%d] %d\n", i, score[i]); 二、分號; 之后加空格 for(i 0; i < student_num; i) 三、關系運算符<、<、>、>、、! 前后加空格 if( (score[i] > 0) && (score[i] < 100) ) 四、賦值運算符…

c++ 多重背包狀態轉移方程_動態規劃入門——詳解經典問題零一背包

本文始發于個人公眾號&#xff1a;TechFlow&#xff0c;原創不易&#xff0c;求個關注今天是周三算法與數據結構專題的第12篇文章&#xff0c;動態規劃之零一背包問題。在之前的文章當中&#xff0c;我們一起探討了二分、貪心、排序和搜索算法&#xff0c;今天我們來看另一個非…

Discuz! 的編碼規范

前言 本規范由編程原則組成&#xff0c;融合并提煉了開發人員長時間積累下來的成熟經驗&#xff0c;意在幫助形成良好一致的編程風格。適用范圍 如無特殊說明&#xff0c;以下規則要求完全適用于Discuz!項目&#xff0c;同時也可大部分適用于COMSENZ旗下其他PHP項目。標準化的重…

C語言代碼規范(三)if語句

一、整型變量與0比較 許多人為了一時之便&#xff0c;模仿布爾變量風格寫為如下代碼 if(value) {... }if(!value) {... } 應當用 或 ! 來與0比較 if(0 value) {... }if(0 ! value) {... } 二、當if內的語句是與常量進行比較時&#xff0c;常量為左值&#xff0c;變量為右…

6月24 面向對象的設計原則-----工廠模式和單列模式

工廠模式&#xff1a; 工廠模式就是專門負責將大量有共同接口的類實例化&#xff0c;而且不必事先知道每次是要實例化哪一個類的模式。它定義一個用于創建對象的接口&#xff0c;由子類決定實例化哪一個類。 工廠模式相當于創建實例對象的new&#xff0c;經常要根據類Class生成…

LeetCode Subsets

原題鏈接在這里&#xff1a;https://leetcode.com/problems/subsets/ 題目&#xff1a; Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order.The solution set must not contain duplicate su…