当前位置: 首页 > 面试题库 >

在Tomcat中通过带有Spring的JMX公开Hibernate(缓存)统计信息

梁丘洲
2023-03-14
问题内容

在基于Spring的设置中收集Hibernate /
Ehcache统计信息并通过JMX公开它们似乎很容易。互联网上有很多资源可以提供帮助,例如http://snippets.dzone.com/posts/show/11159

但是,所有这些文章都假设有人正在使用某种Hibernate会话工厂。我不是-
我的实体带有JPA注释,并且使用javax.persistence.EntityManager。如果我要部署到Java
EE容器,则可以通过JNDI获得Hibernate会话工厂,如此处所述http://internna.blogspot.com/2007/08/hibernate-
statistics-in-
enterprise-5.html但我在使用Tomcat …

怎么办呢?我还没有想出解决方案。

如果我引用了Ehcache CacheManager,则可以尝试以下操作:

<context:mbean-server />
<bean class="net.sf.ehcache.management.ManagementService" init-method="init">
  <constructor-arg ref="..myCacheManager.."/>
  <constructor-arg ref="mbeanServer"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
</bean>

由于缓存管理器是由Hibernate创建的(即它不是Spring Bean),因此将无法工作。我尝试用

<constructor-arg><bean id="cacheManager" class="net.sf.ehcache.CacheManager" factory-method="getInstance"/></constructor-arg>

希望我能以某种方式抓住合适的实例。也不起作用,因为这实际上会创建一个新的缓存管理器实例。


问题答案:

我最终写了下面的课

HibernateStatisticsJmxRegistration

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.persistence.EntityManagerFactory;

import org.hibernate.SessionFactory;
import org.hibernate.ejb.HibernateEntityManagerFactory;
import org.hibernate.jmx.StatisticsService;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Provides code to register Hibernate's statistics bean with a JMX MBean server. Assumes that both
 * the MBeanServer and the EntityManagerFactory are available as Spring-managed beans. Note that
 * while registering this class enables the collection of statistics even if that was previously
 * disabled.
 * <p>
 * May become obsolete once <a href="https://hibernate.onjira.com/browse/HHH-6034">HHH-6034</a> is
 * implemented. Even if not the confusing situation abround the meanwhile deprecated
 * {@link StatisticsService} should be clear then.
 */
@SuppressWarnings({"deprecation", "javadoc" })
public class HibernateStatisticsJmxRegistration {

  @Autowired
  private EntityManagerFactory entityManagerFactory;

  @Autowired
  private MBeanServer mbeanServer;

  private ObjectName objectName;

  private String jmxObjectName = "org.hibernate:name=HibernateStatistics";

  /**
   * Registers the statistics MBean that wraps a Hibernate session factory. The bean is registered
   * under the name provided by {@link HibernateStatisticsJmxRegistration#getJmxObjectName()}.
   *
   * @throws JMException if anything fails..
   * @see HibernateStatisticsJmxRegistration#unregister()
   */
  public void register() throws JMException {
    final SessionFactory sessionFactory = ((HibernateEntityManagerFactory) entityManagerFactory).getSessionFactory();

    objectName = new ObjectName(jmxObjectName);

    final StatisticsService statsMBean = new StatisticsService();
    statsMBean.setSessionFactory(sessionFactory);
    statsMBean.setStatisticsEnabled(true);
    mbeanServer.registerMBean(statsMBean, objectName);
  }

  /**
   * Unregisters the MBean that was registered.
   *
   * @throws JMException if the de-registration fails
   * @see HibernateStatisticsJmxRegistration#register()
   */
  public void unregister() throws JMException {
    mbeanServer.unregisterMBean(objectName);
  }

  /**
   * Override the default JMX object name. Obviously you need to call this method before
   * registration for it to have any effect. The string must comply to the rules described in
   * {@link ObjectName}. Suggested is {@code <domain>:name=<name>}.
   *
   * @param jmxObjectName the name to use during registration
   */
  public void setJmxObjectName(String jmxObjectName) {
    this.jmxObjectName = jmxObjectName;
  }
}

弹簧配置

<!-- Setting up Ehcache manager for various caches (offer facade, images). -->
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  <property name="configLocation" value="classpath:ehcache.xml" />
</bean>  
<ehcache:annotation-driven cache-manager="ehCacheManager" />

<!-- Exposing cache statistics through JMX. -->
<context:mbean-server />
<bean class="net.sf.ehcache.management.ManagementService" init-method="init">
  <constructor-arg ref="ehCacheManager"/>
  <constructor-arg ref="mbeanServer"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
</bean>    
<bean class="HibernateStatisticsJmxRegistration"
      init-method="register" destroy-method="unregister" />


 类似资料:
  • weblogic是否通过Jmx公开指标,以便可以使用prometheus进行监控?监视weblogic服务器(线程、数据源…)的最佳解决方案是什么?

  • 我这里有一个小样本应用程序 这将在数据库中创建一些简单的数据,以及我正在处理的一些其他事情,以在spring boot上解决问题(旁注:到目前为止,我喜欢spring boot!!)。如果克隆git repo,则可以访问url: 它将从数据库加载,并将hibernate统计数据写入控制台。 但是,无论是否通过application.properties文件配置hibernate统计信息,我都有一个

  • 我有一个spring/hibernate项目,我试图通过ehcache和terracotta将二级缓存添加到hibernate。一切似乎都很好,我甚至可以在terracota控制台中看到我试图缓存的实体的条目。但根据数据库的统计数据和日志,根本没有缓存任何内容! 负载命中率是0%,负载统计也是0。我做错了什么? 这是我所做的,我通过maven添加了所需的罐子。 更改了我的Hibernate属性以启

  • 问题内容: X项目包含以下部分: 一个。Spring Data存储库具有单独的方法,例如: b。hibernate方式也使用“ xobjects”缓存。 问题#1 由于有两种添加对象以缓存的方法,因此可能是同一对象出现2次的情况。如何更好地解决这个问题?例如,使用结果对象中的键。就像是: 键=“#result.id” 问题#2 我不想在调用“保存”方法时从缓存中逐出所有对象,但是我不确定当前的实现

  • 问题内容: 我的Java应用程序每10秒向mysql服务器查询一次。 我手动将新行插入表中。 而且Hibernate找不到它。 同样,当我手动删除一行时,Hibernate显示该行存在。 我建议这是因为Hibernate缓存。 有什么办法可以禁用它吗? 谢谢! 问题答案: 您是指一级缓存还是二级缓存?使用诸如Ehcache之类的Hibernate二级缓存来缓存与您手动修改的同一表中的行相对应的实体

  • 问题内容: 我们如何配置,以便我们在基于Spring MVC的Web应用程序中通过JMX获得Hibernate统计信息。有没有更好的跟踪Hibernate性能的方法。 问题答案: 设置为(在会话工厂bean配置中或在会话工厂bean配置中)。然后注册这个bean: (如果您不使用JPA,则只需指定您的bean,而不是通过EMF来获取它) 最后,您需要一个mbean服务器和导出器: