天天看點

mybatis緩存導緻JavaFX資料擷取錯誤問題及解決方案問題描述:詳細說明:問題分析:

問題描述:

JavaFX用戶端程式中,TableView元件通過mybatis從資料庫擷取資料并展示,在TableView中對資料作臨時修改後,希望放棄修改并重新從資料庫加載資料。此時加載資料,發現仍為修改過的臨時資料。

詳細說明:

在JavaFX中,通過mybatis擷取資料,并加載到TableView元件中

private TableView<Data_SC_CZX_BGJ> dataTableView;

private void loadData() {
		dataTableView.getItems().clear();
		MyBatisHandler mybatisHandler = MyBatisHandler.INSTANCE;
		Data_SC_CZX_BGJ_Mapper mapper = (Data_SC_CZX_BGJ_Mapper) mybatisHandler.getSqlSession()
				.getMapper(Data_SC_CZX_BGJ_Mapper.class);
		List<Data_SC_CZX_BGJ> dataList = mapper.getDataListByStatusId(statusid);
		dataTableView.getItems().addAll(dataList);
	}
           

在TableView中對資料作臨時修改

tableColumn_1.setCellFactory(TextFieldTableCell.forTableColumn(new DoubleStringConverter()));
		tableColumn_1.setOnEditCommit((col) -> {
			Data_SC_CZX_BGJ data = (Data_SC_CZX_BGJ) col.getTableView().getItems()
					.get(col.getTablePosition().getRow());
			data.setGj(col.getNewValue());
		});
           

臨時修改後,再次執行loadData()方法,發現加載的資料為修改後的資料。

資料庫中的資料仍是修改前的資料,說明mybatis取得的資料和資料庫中不一緻,初步懷疑是緩存問題。

問題分析:

List<Data_SC_CZX_BGJ> dataList = mapper.getDataListByStatusId(statusid);
           

mybatis擷取資料後,将List對象放在了sqlSession緩存中,此時,我們通過

dataTableView.getItems().addAll(dataList);
           

此行代碼将擷取到的ArrayList加載到TableView中,此處是加載的List對象引用,List對象還在sqlSession的緩存中。

是以,當對TableView中的資料進行臨時修改時,改動的資料直接作用到了緩存中的List對象。

當再次執行loadData方法時,sqlSession直接傳回了緩存中的資料,導緻出錯。

解決方案為,在擷取sqlSession前,通過

sqlSession.clearCache();
           

清空緩存。