hibernate应用中提升系统策略的措施(6)

2019-03-15 18:36

假设我们在一个长度为20的集合类中新增加了一个元素,然后再删除两个。Hibernate 会安排一条 INSERT 语句和两条 DELETE 语句(除非集合类是一个 bag)。这当然是令人满意的。

但是,假设我们删除了 18 个数据,只剩下 2 个,然后新增 3 个。则有两种处理方式:

逐一的删除这 18 个数据,再新增三个;

删除整个集合类(只用一句 DELETE 语句),然后逐一添加 5 个数据。

Hibernate 还没那么聪明,知道第二种选择可能会比较快。(也许让 Hibernate 不这么聪明也是好事,否则可能会引发意外的“数据库触发器”之类的问题。)

幸运的是,你可以强制使用第二种策略。你需要取消原来的整个集合类(解除其引用),然后再返回一个新的实例化的集合类,只包含需要的元素。有些时候这是非常有用的。

显然,一次性删除并不适用于被映射为 inverse=\的集合。 21.6. 监测性能(Monitoring performance)

没有监测和性能参数而进行优化是毫无意义的。Hibernate 为其内部操作提供了一系列的示意图,因此可以从 每个 SessionFactory 抓取其统计数据。 21.6.1. 监测 SessionFactory

你可以有两种方式访问 SessionFactory 的数据记录,第一种就是自己直接调用 sessionFactory.getStatistics() 方法读取、显示统计数据。

此外,如果你打开 StatisticsService MBean 选项,那么 Hibernate 则可以使用 JMX 技术 发布其数据记录。你可以让应用中所有的 SessionFactory 同时共享一个 MBean,也可以每个 SessionFactory 分配一个 MBean。下面的代码即是其演示代码:

// MBean service registration for a specific SessionFactory Hashtable tb = new Hashtable(); tb.put(\, \); tb.put(\, \); ObjectName on = new ObjectName(\, tb); // MBean object name StatisticsService stats = new StatisticsService(); // MBean implementation stats.setSessionFactory(sessionFactory); // Bind the stats to a SessionFactory server.registerMBean(stats, on); // Register the Mbean on the server // MBean service registration for all SessionFactory's Hashtable tb = new Hashtable(); tb.put(\, \); tb.put(\, \); ObjectName on = new ObjectName(\, tb); // MBean object name StatisticsService stats = new StatisticsService(); // MBean implementation server.registerMBean(stats, on); // Register the MBean on the server 你可以通过以下方法打开或关闭 SessionFactory 的监测功能:

在配置期间,将 hibernate.generate_statistics 设置为 true 或 false;

在运行期间,则可以可以通过 sf.getStatistics().setStatisticsEnabled(true) 或 hibernateStatsBean.setStatisticsEnabled(true)

你也可以在程序中调用 clear() 方法重置统计数据,调用 logSummary() 在日志中记录(info 级别)其总结。

21.6.2. 数据记录(Metrics)

Hibernate 提供了一系列数据记录,其记录的内容包括从最基本的信息到与具体场景的特殊信息。所有的测量值都可以由 Statistics 接口 API 进行访问,主要分为三类:

使用 Session 的普通数据记录,例如打开的 Session 的个数、取得的 JDBC 的连接数等;

实体、集合、查询、缓存等内容的统一数据记录。 和具体实体、集合、查询、缓存相关的详细数据记录

例如:你可以检查缓存的命中成功次数,缓存的命中失败次数,实体、集合和查询的使用概率,查询的平均时间等。请注意 Java 中时间的近似精度是毫秒。Hibernate 的数据精度和具体的 JVM 有关,在有些平台上其精度甚至只能精确到 10 秒。

你可以直接使用 getter 方法得到全局数据记录(例如,和具体的实体、集合、缓存区无关的数据),你也可以在具体查询中通过标记实体名、 或 HQL、SQL 语句得到某实体的数据记录。请参考 Statistics、EntityStatistics、CollectionStatistics、SecondLevelCacheStatistics 和 QueryStatistics 的 API 文档以抓取更多信息。下面的代码则是个简单的例子:

Statistics stats = HibernateUtil.sessionFactory.getStatistics(); double queryCacheHitCount = stats.getQueryCacheHitCount(); double queryCacheMissCount = stats.getQueryCacheMissCount(); double queryCacheHitRatio = queryCacheHitCount / (queryCacheHitCount + queryCacheMissCount); log.info(\ + queryCacheHitRatio); EntityStatistics entityStats = stats.getEntityStatistics( Cat.class.getName() ); long changes = entityStats.getInsertCount() + entityStats.getUpdateCount() + entityStats.getDeleteCount(); log.info(Cat.class.getName() + \ + changes + \ ); 如果你想得到所有实体、集合、查询和缓存区的数据,你可以通过以下方法获得实体、集合、查询和缓存区列表:getQueries()、getEntityNames()、getCollectionRoleNames() 和 getSecondLevelCacheRegionNames()。


hibernate应用中提升系统策略的措施(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:郭伟+基于pq分解模型的静态安全分析 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: