mybatis缓存导致JavaFX数据获取错误问题及解决方案

问题描述:

JavaFX客户端程序中,TableView组件通过mybatis从数据库获取数据并展示,在TableView中对数据作临时修改后,希望放弃修改并重新从数据库加载数据。此时加载数据,发现仍为修改过的临时数据。

 

详细说明:

在JavaFX中,通过mybatis获取数据,并加载到TableView组件中

private TableView 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 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 dataList = mapper.getDataListByStatusId(statusid);

mybatis获取数据后,将List对象放在了sqlSession缓存中,此时,我们通过

dataTableView.getItems().addAll(dataList);

此行代码将获取到的ArrayList加载到TableView中,此处是加载的List对象引用,List对象还在sqlSession的缓存中。

因此,当对TableView中的数据进行临时修改时,改动的数据直接作用到了缓存中的List对象。

当再次执行loadData方法时,sqlSession直接返回了缓存中的数据,导致出错。

解决方案为,在获取sqlSession前,通过

sqlSession.clearCache();

清空缓存。

 

 

你可能感兴趣的:(Java)