单个事务中的多表插入或主键链接

时间:2016-01-26 02:49:39

标签: java sql jdbc

使用JDBC,我需要将数据插入SQL数据库表。但是,有一个JSON有效负载几乎需要进入一个单独的表,因此它不会对主表上的排序等进行加权。

出于性能原因,我想批量插入查询 - 但由于它们都是批处理的,因此在批量插入完成之前我将不会拥有主键。

过去我单独处理过它们 - 存储主键和然后将数据插入到辅助表中。但是,很难确保数据的健全性。中断,错误等都可能导致失败。

我需要在单个事务中包含两个插入,或者找到一些更好的方法来连接记录。

目前,这将进入H2数据库,但最终将支持MySQL,并可能支持postgres。

public StorageWriteResult write(List<DataContainer> containers) throws Exception {;
    PreparedStatement statement = null;

    try {
        statement = conn.prepareStatement("INSERT INTO ...");

        for (DataContainer container : containers) {
            statement.setObject(1, container.getString(DataQueries.EventName).get());
            // ...
            statement.addBatch();

            // insert data into a secondary table?
        }

        statement.executeUpdate();
    }
    finally {
        if (statement != null) {
            statement.close();
        }

        conn.close();
    }
    // ...
}

1 个答案:

答案 0 :(得分:0)

打开连接时,请确保您没有启用自动提交。然后运行你的两个插入,然后手动提交,如果一切正常,否则回滚。参见例如 fiddle