【问题标题】:ActiveJDBC batch insert and transactionActiveJDBC 批量插入和事务
【发布时间】:2015-09-17 20:57:19
【问题描述】:

如果数据库对任何插入产生错误,推荐的插入一批记录或不插入记录的方法是什么? 这是我当前的代码:

PreparedStatement ps = Base.startBatch("INSERT INTO table(col1) VALUES(?)");
for (MyModel m : myModels)
    Base.addBatch(ps, m.getCol1());
Base.executeBatch(ps);
ps.close();

这会插入记录,直到第一个失败的记录(如果发生)。
我想要全部或全部插入,然后我正在考虑包装 executeBatch():

Base.openTransaction();
Base.executeBatch(ps);
Base.commitTransaction();

如果正确,我应该在某些try catch中做Base.rollbackTransaction()吗?
我还应该关闭finally 块中的ps.close() 吗?

谢谢!

【问题讨论】:

    标签: activejdbc


    【解决方案1】:

    事务性批处理操作与非批处理操作没有任何不同。请参阅:http://javalite.io/transactions#transacted-activejdbc-example 了解典型模式。

    然后你会这样做:

    List<Person> myModels = new ArrayList<>();
        try{
            Base.openTransaction();
            PreparedStatement ps = Base.startBatch("INSERT INTO table(col1) VALUES(?)");
            for (Person m : myModels){
                Base.addBatch(ps, m.getCol1());
            }
            Base.executeBatch(ps);
            ps.close();
            Base.commitTransaction();
        }catch(Exception e){
            Base.rollbackTransaction();
        }
    

    这样,您的数据在异常情况下是完整的

    【讨论】:

    • 但是在你的例子中ps.close()如果有异常就不会到达,可以吗?
    • 当然,这只是伪代码。您将需要一个 finally 块来关闭资源,包括连接
    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2010-09-07
    • 2018-04-26
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多