mybatis快取,從乙個「靈異」事件說起

2021-10-02 19:14:52 字數 1972 閱讀 7685

talk is cheap. show me the code. 該問題涉及的主要**實現包括

listlistgoodstrack(@param("criteria") goodstrackquerycriteria criteria);

}2.xml定義

select ...

3.service定義

@service

@transactional(propagation = propagation.supports, readonly = true, rollbackfor = exception.class)

public class goodstrackservice extends baseservice

public listgoodstracklist(goodstrackquerycriteria criteria)else

}listlist = new arraylist(goodstrackdtomap.values());

return list;

}}@service

@transactional(propagation = propagation.supports, readonly = true, rollbackfor = exception.class)

public class goodsorderservice extends baseservice

}

大致邏輯就是在goodstrackservice定義了兩個查詢方法,乙個是直接從資料庫中獲取資料,第二個是從資料庫中獲取資料後進行了一些加工(通過某個字段進行合併累加,類似sum group by),然後在goodsorderservice的同乙個方法(該方法是乙個事務方法 )中呼叫這兩個查詢,發現rs2中的資料存在問題, 期望是都應該與資料庫表的資料一致,但其中部分資料卻與查出後進行了修改的rs1中的一致。

簡單介紹下mybatis的兩級快取機制

如何開啟二級快取

1.需要在mybatis-config.xml中設定:

支援的屬性:

已經定位到是由於mybatis的一級快取導致,那如何解決本文提到的問題呢? 基本上有三個解決方向。

1.使用快取的方案

既然要使用快取,那就不能更改快取的資料,此時我們可以在需要更改資料的地方把資料做一次副本拷貝,使其不改變快取資料本身, 如

for (goodstrackdto goodstrackdto : listgoodstrack)else 

}

使用objectutil.clone()方法(hutool工具包中提供)對需要更改的資料做副本拷貝。

2.禁用快取的方案

在xml的sql定義中新增 flushcache="true" 的配置,使該查詢不使用快取,如下

select ...

禁用快取的另一種方案是將一級快取直接設定為statement來進行全域性禁用,在mybatis-config.xml中配置:

3.避開快取的方案

select ...

避開快取的另一種做法是不使用事務,使兩個查詢不在乙個sqlsession中,但有時候事務是必須的,所以得分場景來。

另外由於mybatis的快取都是基於本地的,在分布式環境下可能導致讀取的資料與資料庫不一致,比如乙個服務例項兩次讀取中間,另乙個服務例項對資料進行了更新,則後一次讀取由於快取還是讀取的舊資料,而不是更新後的資料,可能導致問題。這時可以通過將快取設定為statement級別來禁用mybatis快取,通過redis,memcached等來提供分布式的全域性快取。

開發Silverlight 5的乙個靈異事件

之前用silverlight 4開發了乙個脫離瀏覽器的應用,基本功能是新建乙個文件 錄入相關資訊,並可以儲存為本地檔案。新建文件的時候,顯示乙個childwindow讓使用者錄入文件的名稱等。然後動態把文件編輯的檢視新增到layoutroot中。後來,silverlight 5 rc發布後,為了讓儲...

從乙個菜鳥做起

c c 系統架構師 1 精通c c 程式語言,熟悉windows程式設計環境,4年以上開發intel多核 多cpu軟體系統的經驗 2 熟悉linux併發程式設計 併發計算 分布式處理 多核多cpu系統的軟體架構模式 概念和技巧,2年以上的軟體架構設計經驗 3 熟悉資料結構 常用演算法 作業系統原理和...

jsoup 從乙個檔案載入乙個文件

在本機硬碟上有乙個html檔案,需要對它進行解析從中抽取資料或進行修改。可以使用靜態 jsoup.parse file in,string charsetname,string baseuri 方法 file input new file tmp input.html document doc js...