SpringBoot使用jdbcTemplate连接人大金仓按月备份表

1.方式一:采用SELECT * INTO FROM 复制表数据以及结构到新表,再清空原表并重置序列
代码如下:

点击查看代码
private void pnsDataCopy() {
        log.info("{}===>表开始复制",PNS_TABLE);
        long l = System.currentTimeMillis();
        TransactionStatus transactionStatus = null;
        try {
            //开启事务
            transactionStatus = DsJdbcTxUtils.beginTransaction(pnsTxManager);
            //复制表结构以及数据到新表中
            jdbcTemplatePns.execute(String.format("SELECT * INTO %s FROM %s", getTableName(PNS_TABLE), PNS_TABLE));
            //清空旧表
            jdbcTemplatePns.execute(String.format("TRUNCATE TABLE %s", PNS_TABLE));
            //并把人大金仓中的OPC_TABLE表序列重新设置从1开始
            jdbcTemplatePns.execute(String.format("ALTER SEQUENCE %s RESTART WITH 1", PNS_TABLE_SEQ));
            //提交事务
            DsJdbcTxUtils.commitTransaction(pnsTxManager,transactionStatus);
            log.info("{}===>表复制完成",PNS_TABLE);
            log.info("耗时=:{}",System.currentTimeMillis()-l);
        } catch (DataAccessException e) {
            log.error("{},表数据复制和删除操作执行失败===>{}", PNS_TABLE, e.getMessage());
            DsJdbcTxUtils.rollbackTransaction(pnsTxManager,transactionStatus);
        }
    }
耗时: ![](https://img2024.cnblogs.com/blog/3391987/202407/3391987-20240708145339373-518562284.png)

2.方式二: 采用修改表名称,再新建跟表结构一致的原表

点击查看代码
private void opcDataCopy() {
        //获取备份表名
        log.info("{}===>表开始复制",OPC_TABLE);
        long l = System.currentTimeMillis();
        TransactionStatus transactionStatus = null;
        String tableName = getTableName(OPC_TABLE);
        try {
            //开启事务
            transactionStatus = DsJdbcTxUtils.beginTransaction(opcTxManager);
            //重命名表
            jdbcTemplateOpc.execute(String.format("ALTER TABLE %s RENAME TO %s", OPC_TABLE, tableName));
            //创建一个新表跟OPC_TABLE表结构一样
            jdbcTemplateOpc.execute(String.format("CREATE TABLE %s AS SELECT * FROM %s WHERE 1=0", OPC_TABLE, tableName));
            //把人大金仓中的OPC_TABLE_SEQ序列重新设置从1开始
            jdbcTemplateOpc.execute(String.format("ALTER SEQUENCE %s RESTART WITH 1", OPC_TABLE_SEQ));
            //给OPC_TABLE表设置序列OPC_TABLE_SEQ
            jdbcTemplateOpc.execute(String.format("ALTER TABLE %s ALTER COLUMN ID SET DEFAULT NEXTVAL('%s')", tableName, OPC_TABLE_SEQ));
            //提交事务
            DsJdbcTxUtils.commitTransaction(opcTxManager,transactionStatus);
            log.info("{}===>表复制完成",OPC_TABLE);
            log.info("耗时={}",System.currentTimeMillis()-l);
        } catch (DataAccessException e) {
            log.error("{},表数据复制和删除操作执行失败====>{}", OPC_TABLE , e.getMessage());
            DsJdbcTxUtils.rollbackTransaction(opcTxManager,transactionStatus);
        }
    }
耗时: ![](https://img2024.cnblogs.com/blog/3391987/202407/3391987-20240709094328491-506801274.png)

3.总结:方式一会把原表的数据插入到新表,耗时长,方式二修改表的元数据,不涉及到数据插入,效率高,推荐使用方式二

posted @ 2024-07-09 09:03  zhuoyb  阅读(226)  评论(0)    收藏  举报