通大多數orm層框架一樣,mybatis自然也提供了對一級快取和二級快取的支援。一下是一級快取和二級快取的作用於和定義。
1、一級快取是sqlsession級別的快取。在運算元據庫時需要構造 sqlsession物件,在物件中有乙個(記憶體區域)資料結構(hashmap)用於儲存快取資料。不同的sqlsession之間的快取資料區域(hashmap)是互相不影響的。
2、一級快取的作用域是同乙個sqlsession,在同乙個sqlsession中兩次執行相同的sql語句,第一次執行完畢會將資料庫中查詢的資料寫 到快取(記憶體),第二次會從快取中獲取資料將不再從資料庫查詢,從而提高查詢效率。當乙個sqlsession結束後該sqlsession中的一級快取 也就不存在了。mybatis預設開啟一級快取。
一般的我們將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的查詢。
下面主要通過redis實現mybatis的二級快取功能。
<?xml version="1.0" encoding="utf-8"?>
mybatis提供了第三方cache實現的介面,我們自定義mybatisrediscache實現cache介面,**如下:
/**
* * mybatis二級快取實現類
* * @author yumao
* @version 2.2
*/
public class mybatisrediscache implements cache
log.info("redis cache id " + id);
this.id = id;
} @override
public string getid()
@override
public void putobject(object key, object value)
} @override
public object getobject(object key)
} catch (exception e)
return null;
} @override
public object removeobject(object key)
} catch (exception e)
return null;
} @override
public void clear()
@override
public int getsize()
});
return size.intvalue();
} @override
public readwritelock getreadwritelock()
}
redis會自動的將sql+條件+hash等當做key值,而將查詢結果作為value,只有請求中的所有引數都符合,那麼就會使用redis中的二級快取。 Redis實現Mybatis的二級快取
通大多數orm層框架一樣,mybatis自然也提供了對一級快取和二級快取的支援。一下是一級快取和二級快取的作用於和定義。1 一級快取是sqlsession級別的快取。在運算元據庫時需要構造 sqlsession物件,在物件中有乙個 記憶體區域 資料結構 hashmap 用於儲存快取資料。不同的sql...
MyBatis的實現過程
根據xml配置檔案 全域性配置檔案 建立乙個sqlsessionfactory物件。包含資料來源和一些環境執行資訊 sql對映檔案 檔案中配置每乙個sql,以及sql的封裝規則等 將sql對映檔案註冊在全域性配置檔案中 實現 根據全域性配置檔案得到sqlsessionfactory 使用sqlses...
mybatis實現分頁
邏輯分頁 1.1.業務控制層 public void selectdeptwithpage1 1.2 資料訪問層 select from t department and deptname like if where select 2.物理分頁 這種分頁是我們mysql資料庫支援的,其實也就是拼sq...