mybatis 与 ehcache 整合
1.简介
2. 准备工作
3. 配置步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
create table category ( catid varchar (10) not null , name varchar (80) null , descn varchar (255) null , constraint pk_category primary key (catid) ); create table product ( productid varchar (10) not null , category varchar (10) not null , name varchar (80) null , descn varchar (255) null , constraint pk_product primary key (productid), constraint fk_product_1 foreign key (category) references category (catid) ); create index productCat on product (category); create index productName on product ( name ); |
1
2
3
4
|
INSERT INTO category VALUES ( ‘FISH‘ , ‘Fish‘ , ‘<image src="../images/fish_icon.gif"><font size="5" color="blue"> Fish</font>‘ ); INSERT INTO category VALUES ( ‘DOGS‘ , ‘Dogs‘ , ‘<image src="../images/dogs_icon.gif"><font size="5" color="blue"> Dogs</font>‘ ); INSERT INTO product VALUES ( ‘FI-SW-01‘ , ‘FISH‘ , ‘Angelfish‘ , ‘<image src="../images/fish1.gif">Salt Water fish from Australia‘ ); INSERT INTO product VALUES ( ‘FI-SW-02‘ , ‘FISH‘ , ‘Tiger Shark‘ , ‘<image src="../images/fish4.gif">Salt Water fish from Australia‘ ); |
4. cache配置步骤:
1
2
3
4
5
6
|
<? xml version = "1.0" encoding = "UTF-8" ?> < ehcache xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "../bin/ehcache.xsd" > < defaultCache overflowToDisk = "true" eternal = "false" maxElementsInMemory = "1" /> < diskStore path = "D:/cache" /> </ ehcache > |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
< cache type = "org.mybatis.caches.ehcache.LoggingEhcache" /> //最普通的设置,沿用全局设置 < cache type = "org.mybatis.caches.ehcache.LoggingEhcache" > < property name = "timeToIdleSeconds" value = "3600" /> <!--1 hour--> < property name = "timeToLiveSeconds" value = "3600" /> <!--1 hour--> < property name = "maxEntriesLocalHeap" value = "1000" /> < property name = "maxEntriesLocalDisk" value = "10000000" /> < property name = "memoryStoreEvictionPolicy" value = "LRU" /> < cache > <!-- 配置这个mapper使用LRU替换策略。 (个人比较赞同这种配置,因为每个表的数据都不一样,有一些需要经常更新,有得可能某几个字段需要经常做连接, 使用一样的cache不太合适) --> |
1
|
< select id = "getCategory" parameterType = "string" resultType = "Category" useCache = "false" > |
5. 测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
private ApplicationContext application; private CategoryMapper categoryMapper; private ProductMapper productMapper; private String[] categoryId = { "FISH" , "DOGS" , "REPTILES" , "CATS" , "BIRDS" }; @Before public void initSpring() { application = new FileSystemXmlApplicationContext( "resource/applicationContext.xml" ); categoryMapper = application.getBean(CategoryMapper. class ); productMapper = application.getBean(ProductMapper. class ); } @Test public void testSelect() { // the first time long begin = System.nanoTime(); categoryMapper.getCategory(categoryId[ 0 ]); long end = System.nanoTime() - begin; print( "count :" + end); // the second time begin = System.nanoTime(); categoryMapper.getCategory(categoryId[ 0 ]); end = System.nanoTime() - begin; print( "count :" + end); // the third time begin = System.nanoTime(); categoryMapper.getCategory(categoryId[ 0 ]); end = System.nanoTime() - begin; print( "count :" + end); // } @Test public void testInsert() { // the second time long begin = System.nanoTime(); // Product p1 = productMapper.getProduct( "FI-SW-01" ); long end = System.nanoTime() - begin; print( "count :" + end); print( "Category :" +p1.getCategoryId()); Map<String, String> parame = new HashMap<String, String>(); parame.put( "categoryId" , "DOGS" ); parame.put( "productId" , "FI-SW-01" ); begin = System.nanoTime(); productMapper.updateProductById(parame); end = System.nanoTime() - begin; print( "count :" +end); begin = System.nanoTime(); Product p2 = productMapper.getProduct( "FI-SW-01" ); end = System.nanoTime() - begin; print( "count :" +end); print( "Category :" +p2.getCategoryId()); } |
6.总结思考
< diskStore path = "java.io.tmpdir" />
< defaultCache
maxElementsInMemory = "10000"
maxElementsOnDisk = "0"
eternal = "true"
overflowToDisk = "true"
diskPersistent = "false"
timeToIdleSeconds = "0"
timeToLiveSeconds = "0"
diskSpoolBufferSizeMB = "50"
diskExpiryThreadIntervalSeconds = "120"
memoryStoreEvictionPolicy = "LFU"
/>
< cache name = "myCache"
maxElementsInMemory = "100"
maxElementsOnDisk = "0"
eternal = "false"
overflowToDisk = "false"
diskPersistent = "false"
timeToIdleSeconds = "120"
timeToLiveSeconds = "120"
diskSpoolBufferSizeMB = "50"
diskExpiryThreadIntervalSeconds = "120"
memoryStoreEvictionPolicy = "FIFO"
/>
</ ehcache >
diskStore :指定数据存储位置,可指定磁盘中的文件夹位置
defaultCache : 默认的管理策略
- name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
- maxElementsInMemory: 在内存中缓存的element的最大数目。
- maxElementsOnDisk: 在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
- eternal: 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。
- overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。
- timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
- timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
- diskPersistent: 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
- diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
- diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
- memoryStoreEvictionPolicy: 如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。
FIFO ,first in first out (先进先出).
LFU , Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
LRU ,Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。