一、需求背景
项目中经常会去对接第三方的数据,将对方的用户组织等信息同步过来,此时会遇到几个问题就是数据量大的时候性能问题,数据部分更新时又该怎么同步,但这些数据基本都有状态和更新时间,根据该两个值去新增和更新即可,但是最近遇到一个即没有更新时间也没有状态的表,这样子导致没法增量更新,删除了的数据也没法同步,只能每次删除全量的数据然后重新获取
二、JdbcTemplate无法开启事务(存疑)
首先先说JdbcTemplate无法开启事务,百度之后网友说在方法上添加注解
@Transactional即可,区别是网友用的是xml去说明这个JdbcTemplate,而我是手动去set这个JdbcTemplate
BasicDataSource dataSource = new BasicDataSource();
//jdbc driver类
dataSource.setDriverClassName(domainDriverClassName);
//url
dataSource.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+条一起执行,多了的会被忽略掉