一、需求背景
项目中经常会去对接第三方的数据,将对方的用户组织等信息同步过来,此时会遇到几个问题就是数据量大的时候性能问题,数据部分更新时又该怎么同步,但这些数据基本都有状态和更新时间,根据该两个值去新增和更新即可,但是最近遇到一个即没有更新时间也没有状态的表,这样子导致没法增量更新,删除了的数据也没法同步,只能每次删除全量的数据然后重新获取
二、JdbcTemplate无法开启事务(存疑)
首先先说JdbcTemplate无法开启事务,百度之后网友说在方法上添加注解
@Transactional即可,区别是网友用的是xml去说明这个JdbcTemplate,而我是手动去set这个JdbcTemplate
BasicDataSource dataSource = new BasicDataSource();//jdbc driver类dataSource.setDriverClassName(domainDriverClassName);//urldataSource.setUrl(http://localhost:3306);//用户名dataSource.setUsername(domainUserName);//密码dataSource.setPassword(domainPassword);dataSource.setDefaultTransactionIsolation(2);dataSource.setRemoveAbandonedOnBorrow(true);dataSource.setRemoveAbandonedOnMaintenance(true);dataSource.setRemoveAbandonedTimeout(300);dataSource.setLogAbandoned(false);dataSource.setMaxTotal(dsMaxTotal);dataSource.setMinIdle(2);dataSource.setMaxWaitMillis(30000);JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);
然后在方法前添加@Transactional注解,但是不生效,这里有个小知识点,ddm语句是不会回滚的
jdbcTemplate.execute("truncate table db_gx_lineage_data");
int i = 1/0;
虽然方法前加了注解,但是执行到1/0的时候报错,但是并没有回滚,一开始以为是ddm语句无法回滚的问题,后续又把truncate换成delete,但是发现仍然不会回滚,数据库的数据还是被删除了,广大的网友们,知道jdbcTemplate怎么开启事务的欢迎留言交流
三、使用Statement手动开启事务
Connection connection = dataSource.getConnection();connection.setAutoCommit(false);Statement statement = connection.createStatement();statement.execute("delete from db_gx_lineage_data");
statement也可以执行批量任务,其中有个addBatch(Sql)的方法,可以一直往里面添加sql然后批量执行executeBatch()方法即可,这里有个问题就是,批量执行有个条数上线,根据网友描述一次只能5w+条一起执行,多了的会被忽略掉