现象: 框架中的分页插件不自动的查询count值了; 找了对应的分页插件信息并没有什么变化,并且在有些服务中可以正常使用,有些服务中不能正常使用了,这就很让人费解
首先这个分页的插件是自定义,自动查询count 数量,前端传递不同参数,对应的控制当前页,和每页显示几条;分页插件只对数据库的查询操作进行拦截,后面我会发源码出来;
原因: 近期在各服务项目中改用了seata 来出来分布式事物问题
alibaba-seata和自定义的数据库分页插件PaginationInterceptor相互影响了,只要是开启了seate 注解对应的服务,都会导致分页的插件不能正常的分页.是因为我们在初始化seata 时对sqlSessionFactory 进行了代理修改了一些内容导致了分页插件不能正常使用;
结论:如果对sqlSessionFactory 进行了代理,就需要彻底的把自己用到的一些功能信息都加上,不然就会导致一些bug出现sqlSessionFactoryBean.setPlugins(new Interceptor[] { pageHelper });
下面是分页插件代码;
public class PaginationInterceptor extends BaseInterceptor {
private static final long serialVersionUID = 1L;
@Override
public Object intercept(Invocation invocation) throws Throwable {
if (ConverterUtil.isEmpty(DIALECT)) {
setProperties(null);
}
final MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
// //拦截需要分页的SQL
//// if (mappedStatement.getId().matches(_SQL_PATTERN)) {
// if (StringUtils.indexOfIgnoreCase(mappedStatement.getId(), _SQL_PATTERN) != -1) {
Object parameter = invocation.getArgs()[1];
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
Object parameterObject = boundSql.getParameterObject();
// 获取分页参数对象
Page
seata 初始化的代码
public class DynamicDataSourceConfiguration {
@Autowired
private MultiDataSourceRegister register;
@Autowired
private DynamicDataSource dynamicDataSource;
@Autowired
private PaginationInterceptor pageHelper;
@PostConstruct
public void initDataSourceProxy() {
Map dataSources = register.getDataSources();
Map
将工程中分页的插件 注入进来,进行设置