SysRole.java和SysUser.java的序列化实现:
publicclasssysuserimplementsserializable { privatestaticfinallongserialversionuid=632094190822932112 l;
}
publicclasssysroleimplementsserializable { privatestaticfinallongserialversionuid=632094190822932112 l;
}
2 .代码测试准备:
@Testpublic voidtestDirtyDate () {
sqlsessionsqlsession=getsql session (; try{
usermapperusermapper=SQL session.get mapper (user mapper.class;
sysuser user=user mapper.selectuserandrolebyid (1001 l;
Assert.assertEquals (“一般用户”,user.getRole ) ).getRoleName );
System.out.println (角色名称(user.getRole ) ).getRoleName );
}finally{
sqlSession.close (;
}
System.out.println ('打开新会话';
sqlSession=getSqlSession (; try{
rolemapperrolemapper=SQL session.get mapper (role mapper.class;
sysrolerole=role mapper.selectbyid (2l;
role.setRoleName (“脏数据”); //提出修改
sqlSession.commit (;
}finally{
sqlSession.close (;
}
system.out.println ('打开第二个新会话';
sqlSession=getSqlSession (; try{
usermapperusermapper=SQL session.get mapper (user mapper.class;
rolemapperrolemapper=SQL session.get mapper (role mapper.class;
sysuser user=user mapper.selectuserandrolebyid (1001 l;
sysrolerole=role mapper.selectbyid (2l;
Assert.assertEquals (“一般用户”,user.getRole ) ).getRoleName );
Assert.assertEquals ('脏数据',role.getRoleName ) );
System.out.println (角色名称(user.getRole ) ).getRoleName ); //恢复数据
role.setRoleName (“一般用户”);
rolemapper.updatebyid(role;
sqlSession.commit (;
}finally{
sqlSession.close (;
}
}
测试后的结果:
debug [ main ]-cachehitratio [ com.example.simple.mapper.user mapper ] 3360.0
debug [ main ]--==preparing : selectu.id,u.user_name userName,u.user_password userPassword,u.user _ name r.id 'role.id ',r.role_name 'role.roleName ',r.e nabble r.create _ time ' role.createtime ' from sys _ from
DEBUG [main] -==gt
; Parameters: 1001(Long)TRACE [main] - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime, role.id, role.roleName, role.enabled, role.createBy, role.createTime
TRACE [main] - <== Row: 1001, test, 123456, test@mybatis.com, <>, <>, 2020-12-01 20:05:01, 2, 普通用户, 1, 1, 2020-12-01 20:05:04
DEBUG [main] - <== Total: 1
角色名:普通用户
开启一个新的session
DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.0
DEBUG [main] - ==> Preparing: select id, role_name,enabled,create_by,create_time from sys_role where id = ?
DEBUG [main] - ==> Parameters: 2(Long)
TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time
TRACE [main] - <== Row: 2, 普通用户, 1, 1, 2020-12-01 20:05:04
DEBUG [main] - <== Total: 1
开启第二个新的session
DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.UserMapper]: 0.5
DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.5
角色名:普通用户
DEBUG [main] - ==> Preparing: update sys_role set enabled = ? where id = ?
DEBUG [main] - ==> Parameters: 1(Integer), 2(Long)
DEBUG [main] - <== Updates: 1
测试的思路和脏数据产生分析是:
第一个sqlSession负责先关联用户表和角色表将user_id = 1001L的用户信息和角色信息查询出来;
第二个sqlSession负责将上一个sqlSession中查询到的角色信息对应的role_id进行再查询,并对role_name进行赋值,使得role_name被赋予新值;
第三个sqlSession分别通过SysUser类和SysRole类获取角色name,发现两者取出来的值并不一样,这时就出现了脏数据,这时因为UserMapper.xml和RoleMapper.xml中分别设置的二级缓存互不影响,这时就出现了同一角色对应两个name。
二、脏数据避免
脏数据产生原因是二级缓存在不同的mapper.xml中,因此出现了缓存内容不一样,内容显示不一致的原因,这时解决方案如下:
这时测试结果是:
DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.0
DEBUG [main] - ==> Preparing: select u.id, u.user_name userName, u.user_password userPassword, u.user_email userEmail , u.user_info userInfo , u.head_img headImg, u.create_time createTime , r.id "role.id", r.role_name "role.roleName" , r.enabled "role.enabled" , r.create_by "role.createBy", r.create_time "role.createTime" from sys_user u inner join sys_user_role ur on u.id = ur.user_id inner join sys_role r on ur.role_id = r.id where u.id = ?
DEBUG [main] - ==> Parameters: 1001(Long)
TRACE [main] - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime, role.id, role.roleName, role.enabled, role.createBy, role.createTime
TRACE [main] - <== Row: 1001, test, 123456, test@mybatis.com, <>, <>, 2020-12-01 20:05:01, 2, 普通用户, 1, 1, 2020-12-01 20:05:04
DEBUG [main] - <== Total: 1
角色名:普通用户
开启一个新的session
DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.0
DEBUG [main] - ==> Preparing: select id, role_name,enabled,create_by,create_time from sys_role where id = ?
DEBUG [main] - ==> Parameters: 2(Long)
TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time
TRACE [main] - <== Row: 2, 普通用户, 1, 1, 2020-12-01 20:05:04
DEBUG [main] - <== Total: 1
开启第二个新的session
DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.3333333333333333
DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.5
角色名:普通用户
DEBUG [main] - ==> Preparing: update sys_role set enabled = ? where id = ?
DEBUG [main] - ==> Parameters: 1(Integer), 2(Long)
DEBUG [main] - <== Updates: 1
这样一来,二级缓存就存在于两个关联表中,因此就实现了脏数据的避免。