天天看点

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();
           

清空缓存。