JHipster一知半解- 3.5Database相关配置

回文集目录:JHipster一知半解

Using Cache 翻译 (不包含Infinispan)

http://www.jhipster.tech/using-cache/

JHipster的缓存使用分为3个层次。

第一层次,作为Hibernate的2级缓存,此方案能大大地提升应用的性能。这也是JHipster的一般性配置,但是它只对SQL数据库生效。

第二层次,Spring实现了抽象缓存,可以同过@EnableCaching注释,它能自动识别
Ehcache/Hazelcast/Infinispan三种缓存,这个功能通常与具体的业务需求息息相关,并且它处于比Hibernate二级缓存更为高的层级(通常位于Service层)。但是,我们并不
推荐同时使用Spring抽象缓存和Hibernate二级缓存,因为这样可能引起缓存不一致问题,是的问题定位相当复杂。

第三层次,对于HTTP会话集群环境,一个好的缓存解决方案需要在多个节点间共享、替换用户的HTTP会话,并且能支持应用平滑水平扩展。目前,Hazelcast是一个可行的解决方案,但它要求应用相当稳定(无频繁重启,更新),因此它不是JHipster的默认设置,也不推荐使用。通常的做法是在应用节点之前,有前置负载均衡节点(Nginx)。

一般性配置

Cache 配置位于CacheConfiguration(config package),它能使用JHipster的通用应用属性进行配置。
代码位于io.github.jhipster.config.JHipsterProperties的内部类Cache.每个子类如Hazelcast又有不同的具体配置.

public static class Cache {

        private final Hazelcast hazelcast = new Hazelcast();

        private final Ehcache ehcache = new Ehcache();

        private final Infinispan infinispan = new Infinispan();
}

使用Ehcache缓存

对于JHipster单体应用,Ehcache是默认的缓存方案。Ehcache具有简单配置,简单安装,启动快速的特点,因而,对于“普通”单体应用,它是一个完美的解决方案。

对于JHipster,Ehcache存在两点限制:

它无法应用于HTTP会话集群;

它无法以分布式缓存的模式工作,由于它并没有API允许编程式添加新节点。

在Spring配置bean(CacheConfiguration)中,Ehcache有两个配置属性(生存时间与最大实体数),在应用中可以增加配置更多的特性应用属性,覆盖默认的属性。

默认地,生存时间设置为3600秒(1小时),测试和生产模式一致。最多实体默认就有所不同了,测试模式为100个,生产模式为1000个。

这些值应该根据具体的业务需求进行调整,JHipster的监控页面可以显示应用程序中缓存的使用情况,方便理解和调整为合适的数值。请参考Ehcache的文档,以便于合理地调整参数值。

使用Hazelcast缓存

Hazelcast 能作为一个本地缓存(类似Ehcache),但它还能作为分布式缓存.因此:

它能用来完成HTTP会话集群
它是微服务架构的默认选项,因为微服务需要比起单体应用更需要平滑扩展的功能.JHipster registry心选项需要Hazelcast实现扩展性.而且对于单体应用和微服务应用,Hazelcast都能用来做垂直扩展。在微服务架构中,JHipster Registry或Consul都能同时使用上,而对于单体应用,仅JHipster Registry能用上JHipster Registry缓存功能

当新增一个节点时,它将把自己进行注册,以便于服务发现(例如,当存在JHipster Registry时,这便可行),并能通过同样的方法查找其他同类型节点。如果它你那个找到一个或机构同样类型的节点,它将作为集群节点加入它们,这将在每个节点中产生日志消息,开始是下面的例子这样:

[172.18.0.10]:5701 [dev] [3.7]
Members [4] {
Member [172.18.0.10]:5701 - 3cbddfcd-0229-4cd5-be55-4611927a9071 this
Member [172.18.0.5]:5701 - 204d457d-f6fe-43f2-8e8d-497e96b3f08e
Member [172.18.0.14]:5701 - 7804d535-86fb-46be-b2a5-d7801dc6a4df
Member [172.18.0.11]:5701 - 6114ae28-56cd-4840-a575-4d73a6003744
}

源码解析

Hibernate使用RegionFactory实现2级缓存,因而从
org.hibernate.cache.spi.RegionFactory入手查看2种实现的不同

  1. Ehcache

pom.xml

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jcache</artifactId>
    <version>${hibernate.version}</version>
</dependency>

这里可以看出,ehcache是hibernate的默认2级缓存,因而是由Hibernate实现二者之间的适配.具体可参考org.hibernate.cache.jcache.JCacheRegionFactory.

application-×.yml

spring:
    jpa:
        properties:
            hibernate.id.new_generator_mappings: true
            hibernate.cache.use_second_level_cache: true
            hibernate.cache.use_query_cache: false
            hibernate.generate_statistics: true
            hibernate.cache.region.factory_class: io.github.jhipster.config.jcache.NoDefaultJCacheRegionFactory

这里指定了factory_class为没有实现的RegionFactory,那就是说,实际上用的是Hibernate的实现?

CacheConfiguration

@Bean
    public JCacheManagerCustomizer cacheManagerCustomizer() {
        return cm -> {
            cm.createCache("users", jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.User.class.getName(), jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.Authority.class.getName(), jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.User.class.getName() + ".authorities", jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.BankAccount.class.getName(), jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.BankAccount.class.getName() + ".operations", jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.Label.class.getName(), jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.Label.class.getName() + ".operations", jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.Operation.class.getName(), jcacheConfiguration);
            cm.createCache(io.github.jhipster.sample.domain.Operation.class.getName() + ".labels", jcacheConfiguration);
            // jhipster-needle-ehcache-add-entry
        };

这里仅针对cm进行设置,毕竟ehcache是默认实现,无需特殊的额外配置.

  1. Hazelcast

pom.xml

<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast</artifactId>
</dependency>
<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast-hibernate52</artifactId>
    <version>${hazelcast-hibernate52.version}</version>
</dependency>
<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast-spring</artifactId>
</dependency>

是Hazelcast适配Hibernate,因而需要引入hazelcast-hibernate52实现RegionFactory.
com.hazelcast.hibernate.HazelcastCacheRegionFactory

application-×.yml

spring:
    jpa:
        properties:
            hibernate.id.new_generator_mappings: true
            hibernate.cache.use_second_level_cache: true
            hibernate.cache.use_query_cache: false
            hibernate.generate_statistics: true
            hibernate.cache.region.factory_class: com.hazelcast.hibernate.HazelcastCacheRegionFactory
            hibernate.cache.hazelcast.instance_name: jhipster
            hibernate.cache.use_minimal_puts: true
            hibernate.cache.hazelcast.use_lite_member: true

这里配置了spring-jpa的2级缓存设置。特别注意的是hibernate.cache.region.factory_class指定了hazelcast的实现。

CacheConfiguration

这里通过编程方式实例化了hazelcastInstance,并传递给cacheManager,作为spring的抽象缓存使用.

@Bean
    public CacheManager cacheManager(HazelcastInstance hazelcastInstance) {
        log.debug("Starting HazelcastCacheManager");
        CacheManager cacheManager = new com.hazelcast.spring.cache.HazelcastCacheManager(hazelcastInstance);
        return cacheManager;
    }
资源和书籍推荐

1.javax.cache
http://blog.csdn.net/caomiao2006/article/details/51934326

2.spring的cache(@EnableCache)
http://blog.csdn.net/taiyangdao/article/details/51095410
https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/
http://jinnianshilongnian.iteye.com/blog/2001040
http://www.jianshu.com/p/49fc4065201a
https://zhuanlan.zhihu.com/p/24796537

3.Jhipster的Ehcache
http://www.cnblogs.com/zhangzhen894095789/p/6525845.html
http://zzc1684.iteye.com/blog/2118881
http://www.genshuixue.com/i-cxy/p/8018215

4.jhipster的hazelcast
http://angelbill3.iteye.com/blog/2342989
http://www.jianshu.com/p/3a0eb8af48fd
http://docs.hazelcast.org/docs/3.8.3/manual/html-single/index.html#spring-integration

Hibernate Cache的深入认识
http://www.litianhua.net/blog/hibernate-cache.html
http://www.litianhua.net/blog/jpa-second-level-cache.html
http://leobluewing.iteye.com/blog/2032396
https://en.wikibooks.org/wiki/Java_Persistence/Caching
Hibernate二级缓存详解(http://www.blogjava.net/supercrsky/articles/238580.html)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,802评论 6 342
  • 要加“m”说明是MB,否则就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms8...
    dadong0505阅读 4,829评论 0 53
  • 在我搭建基于Spring Cloud的微服务体系应用的时候所需要或者是常用的属性配置文件,还有这些属性的用途,此配...
    StrongManAlone阅读 4,020评论 0 18
  • 世界很纷乱,陌生已不如从前。昨日重走东湖,湖滨芳草路,繁花似锦,春天的气息迎面而来。遥记当年,朗日晴空,踢踏...
    比秋乡阅读 144评论 4 4