国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Redis實現Mybatis的二級緩存

2019-11-11 01:39:32
字體:
來源:轉載
供稿:網友

一、Mybatis的緩存

通大多數ORM層框架一樣,Mybatis自然也提供了對一級緩存和二級緩存的支持。一下是一級緩存和二級緩存的作用于和定義。

    1、一級緩存是Sqlsession級別的緩存。在操作數據庫時需要構造 sqlSession對象,在對象中有一個(內存區域)數據結構(HashMap)用于存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。 二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession去操作數據庫得到數據會存在二級緩存區域,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。

    2、一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。當一個sqlSession結束后該sqlSession中的一級緩存也就不存在了。Mybatis默認開啟一級緩存。

    二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執行相同namespace下的sql語句且向sql中傳遞參數也相同即最終執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。Mybatis默認沒有開啟二級緩存需要在setting全局參數中配置開啟二級緩存。     一般的我們將Mybatis和sPRing整合時,mybatis-spring包會自動分裝sqlSession,而Spring通過動態代理sqlSessionProxy使用一個模板方法封裝了select()等操作,每一次select()查詢都會自動先執行openSession(),執行完close()以后調用close()方法,相當于生成了一個新的session實例,所以我們無需手動的去關閉這個session(),當然也無法使用mybatis的一級緩存,也就是說mybatis的一級緩存在spring中是沒有作用的。     因此我們一般在項目中實現Mybatis的二級緩存,雖然Mybatis自帶二級緩存功能,但是如果實在集群環境下,使用自帶的二級緩存只是針對單個的節點,所以我們采用分布式的二級緩存功能。一般的緩存NoSql數據庫如Redis,Mancache等,或者EhCache都可以實現,從而更好地服務tomcat集群中ORM的查詢。

二、Mybatis的二級緩存的實現

下面主要通過Redis實現Mybatis的二級緩存功能。

1、配置文件中開啟二級緩存

[html] view plain copy 在CODE上查看代碼片派生到我的代碼片

默認二級緩存是開啟的。

2、實現Mybatis的Cache接口

Mybatis提供了第三方Cache實現的接口,我們自定義MybatisRedisCache實現Cache接口,代碼如下:

public class MybatisRedisCache implements Cache { private static final Logger LOG = Logger.getLogger(MybatisRedisCache.class); private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true); private RedisTemplate<Serializable, Serializable> redisTemplate = (RedisTemplate<Serializable, Serializable>) SpringContextHolder.getBean("redisTemplate"); private String id; private JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(); public MybatisRedisCache(final String id){ if(id == null){ throw new IllegalArgumentException("Cache instances require an ID"); } LOG.info("Redis Cache id " + id); this.id = id; } @Override public String getId() { return this.id; } @Override public void putObject(Object key, Object value) { if(value != null){ redisTemplate.opsForValue().set(key.toString(), jdkSerializer.serialize(value), 2, TimeUnit.DAYS); } } @Override public Object getObject(Object key) { try { if(key != null){ Object obj = redisTemplate.opsForValue().get(key.toString()); return jdkSerializer.deserialize((byte[])obj); } } catch (Exception e) { LOG.error("redis "); } return null; } @Override public Object removeObject(Object key) { try { if(key != null){ redisTemplate.expire(key.toString(), 1, TimeUnit.SECONDS); } } catch (Exception e) { } return null; } @Override public void clear() { //jedis nonsupport } @Override public int getSize() { Long size = redisTemplate.getMasterRedisTemplate().execute(new RedisCallback<Long>(){ @Override public Long doInRedis(RedisConnection connection) throws DataaccessException { return connection.dbSize(); } }); return size.intValue(); } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; } }

3、二級緩存的實用

我們需要將所有的實體類進行序列化,然后在Mapper中添加自定義cache功能。

<cache type="org.andy.shop.cache.MybatisRedisCache" eviction="LRU" flushInterval="6000000" size="1024" readOnly="false" />

4、Redis中的存儲

redis會自動的將Sql+條件+Hash等當做key值,而將查詢結果作為value,只有請求中的所有參數都符合,那么就會使用redis中的二級緩存。其查詢結果如下: 這里寫圖片描述


上一篇:網絡爬蟲爬取小說3

下一篇:Vector

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 渭源县| 沙湾县| 芒康县| 广昌县| 曲水县| 北宁市| 西乌| 钦州市| 上饶市| 凤翔县| 内江市| 磐石市| 富顺县| 鄂托克前旗| 晋城| 兖州市| 顺平县| 囊谦县| 上饶县| 邹平县| 报价| 疏附县| 花莲县| 屏东市| 萨迦县| 叙永县| 长泰县| 福清市| 论坛| 息烽县| 安新县| 新泰市| 留坝县| 静安区| 兴业县| 习水县| 蓝山县| 玉山县| 长治市| 全南县| 左贡县|