数据源管理 | 动态权限校验,表结构和数据迁移流程 (2)

读库尝试一次单条数据读取,写库尝试一次不成立条件的写入,如果没有权限,会抛出相应异常。

@RestController public class CheckController { @Resource private ConnectionFactory connectionFactory ; // MySQLSyntaxErrorException: SELECT command denied to user @GetMapping("/checkRead") public String checkRead (){ try { String sql = BuildSql.buildReadSql("rw_read") ; ExecuteSqlUtil.query(connectionFactory.getByKey(JdbcConstant.READ),sql) ; return "success" ; } catch (SQLException e) { e.printStackTrace(); } return "fail" ; } // MySQLSyntaxErrorException: INSERT command denied to user @GetMapping("/checkWrite") public String checkWrite (){ try { String sql = BuildSql.buildWriteSql("rw_read") ; ExecuteSqlUtil.update(connectionFactory.getByKey(JdbcConstant.WRITE),sql) ; return "success" ; } catch (SQLException e) { e.printStackTrace(); } return "fail" ; } } 2、同步表结构

这里执行最简单操作,把读库表创建语句查询出来,丢到写库中执行。

@RestController public class StructController { @Resource private ConnectionFactory connectionFactory ; @GetMapping("/syncStruct") public String syncStruct (){ try { String sql = BuildSql.buildStructSql("rw_read") ; ResultSet resultSet = ExecuteSqlUtil.query(connectionFactory.getByKey(JdbcConstant.READ),sql) ; String createTableSql = null ; while (resultSet.next()){ createTableSql = resultSet.getString("Create Table") ; } if (StringUtils.isNotEmpty(createTableSql)){ ExecuteSqlUtil.update(connectionFactory.getByKey(JdbcConstant.WRITE),createTableSql) ; } return "success" ; } catch (SQLException e) { e.printStackTrace(); } return "fail" ; } } 3、同步表数据

读库的表数据读取,批量放入写库中。这里特别说一个方法:statement.setObject();在不知道参数个数和类型时,自动适配数据类型。

@RestController public class DataSyncController { @Resource private ConnectionFactory connectionFactory ; @GetMapping("/dataSync") public List<RwReadEntity> dataSync (){ List<RwReadEntity> rwReadEntities = new ArrayList<>() ; try { Connection readConnection = connectionFactory.getByKey(JdbcConstant.READ) ; String sql = BuildSql.buildSelectSql("rw_read") ; ResultSet resultSet = ExecuteSqlUtil.query(readConnection,sql) ; while (resultSet.next()){ RwReadEntity rwReadEntity = new RwReadEntity() ; rwReadEntity.setId(resultSet.getInt("id")); rwReadEntity.setSign(resultSet.getString("sign")); rwReadEntities.add(rwReadEntity) ; } if (rwReadEntities.size() > 0){ Connection writeConnection = connectionFactory.getByKey(JdbcConstant.WRITE) ; writeConnection.setAutoCommit(false); PreparedStatement statement = writeConnection.prepareStatement("INSERT INTO rw_read VALUES(?,?)"); // 基于动态获取列,和statement.setObject();自动适配数据类型 for (int i = 0 ; i < rwReadEntities.size() ; i++){ RwReadEntity rwReadEntity = rwReadEntities.get(i) ; statement.setInt(1,rwReadEntity.getId()) ; statement.setString(2,rwReadEntity.getSign()) ; statement.addBatch(); if (i>0 && i%2==0){ statement.executeBatch() ; } } // 处理最后一批数据 statement.executeBatch(); writeConnection.commit(); } return rwReadEntities ; } catch (SQLException e) { e.printStackTrace(); } return null ; } } 4、分页查询

提供一个分页查询工具,在数据量大的情况下不能一次性读取大量的数据,避免资源占用过高。

public class PageUtilEntity { /** * 分页生成方法 */ public static PageHelperEntity<Object> pageResult (int total, int pageSize,int currentPage, List dataList){ PageHelperEntity<Object> pageBean = new PageHelperEntity<Object>(); // 总页数 int totalPage = PageHelperEntity.countTotalPage(pageSize,total) ; // 分页列表 List<Integer> pageList = PageHelperEntity.pageList(currentPage,pageSize,total) ; // 上一页 int prevPage = 0 ; if (currentPage==1){ prevPage = currentPage ; } else if (currentPage>1&&currentPage<=totalPage){ prevPage = currentPage -1 ; } // 下一页 int nextPage =0 ; if (totalPage==1){ nextPage = currentPage ; } else if (currentPage<=totalPage-1){ nextPage = currentPage+1 ; } pageBean.setDataList(dataList); pageBean.setTotal(total); pageBean.setPageSize(pageSize); pageBean.setCurrentPage(currentPage); pageBean.setTotalPage(totalPage); pageBean.setPageList(pageList); pageBean.setPrevPage(prevPage); pageBean.setNextPage(nextPage); pageBean.initjudge(); return pageBean ; } } 四、最后总结

很多复杂度偏高的业务,越是需要借助基础API解决,因为复杂度高,不容易抽象化统一封装,如果数据同步这块业务,可以适配多种数据库,完全可以独立封装为中间件,开源项目中关于多方数据同步或计算的中间件也有好多,可以自行了解下,增长眼界开阔思路。

五、源代码地址 GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppwfg.html