Mybatis支持各种二级缓存实现,其中就包括Hazelcast. 我们都知道Hazelcast是一个分布式内存网格(In-Memory-Data-Grid), 但是大多数时候都被用做分布式缓存。
将Hazelcast作为Mybatis的二级缓存来使用时,将其配置为stand-alone的模式,即单节点,不尝试连接到任何集群。我们分为几个步骤来做。
第一步,引入Maven依赖:
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-hazelcast</artifactId>
<version>1.1.2</version>
</dependency>
引入这一个依赖就好,会自动关联依赖Hazelcast 3.7.2版本, 不需要自己再去引入其他版本的Hazelcast依赖,以免出现兼容问题。
第二步,在mapper文件中开启cache:
<mapper namespace="org.acme.FooMapper">
<cache type="org.mybatis.caches.hazelcast.LoggingHazelcastCache"/>
...
</mapper>
这里社区给的参考是LoggingHazelcastCache, 也就是一个本地的hazelcast单节点,也可以使用LoggingHazelcastClientCache,就是一个本地的Hazelcast Client节点,可以连接到一个Hazelcast集群。
第三步,添加hazelcast的配置文件。
Mybatis会使用默认的hazelcast配置来启动hazelcast,但是还是建议自己添加一个配置文件,对hazelcast进行配置,如果使用的是LoggingHazelcastCache,则添加hazelcast.xml:
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast xmlns="http://www.hazelcast.com/schema/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-3.12.xsd">
<group>
<name>hazelcast-server</name>
</group>
<network>
<port auto-increment="false">5701</port>
<join>
<multicast enabled="false">
</multicast>
<tcp-ip enabled="false">
<member-list>
<member>127.0.0.1</member>
</member-list>
</tcp-ip>
</join>
</network>
</hazelcast>
如果使用的是LoggingHazelcastClientCache,则添加hazelcast-client.xml:
hazelcast-client:
group:
name: hazelcast-server
network:
cluster-members:
- 127.0.0.1
smart-routing: true
redo-operation: true
connection-timeout: 5000
connection-attempt-period: 1000
connection-attempt-limit: 0
properties:
hazelcast.client.invocation.timeout.seconds: 5
hazelcast.client.heartbeat.interval: 5000
hazelcast.client.heartbeat.timeout: 30000
这样mybatis的hazelcast二级缓存就已经开启了,不过此时还会有两个问题。
第一, 使用hazelcast作为二级缓存时,mapper中<cache>标签原先的eviction、flushInterval、size等等属性都不生效了,无法通过<cache>标签的配置来控制二级缓存的大小限制及生命周期,这里可以通过配置hazelcast.xml文件来达到相同效果。每一个mapper类名和在hazelcast中的map名一一对应,在hazelcast.xml文件中添加以下配置:
<map name="com.chinaums.cache_bp.mapper.OnmiojiMapper">
<max-size policy="PER_NODE">1000</max-size>
<eviction-policy>LRU</eviction-policy>
<time-to-live-seconds>10</time-to-live-seconds>
</map>
即可完成对二级缓存的控制。
第二,如果使用的是springboot,那么在启动时springboot发现你依赖了hazelcast的jar包,会自动帮配置一个hazelcast实例的bean,你会发现你的hazelcast启动了两次,甚至形成了一个集群?这时可以关闭springboot原先的自动配置:
@SpringBootApplication(exclude = HazelcastAutoConfiguration.class)
将这一句加在application类上。