簡體   English   中英

使用JDBC批量插入具有外鍵的多個表

[英]Batch insert to multiple tables with foreign keys using JDBC

我正在編寫一個接收樹結構並將其插入數據庫的方法,其中每個分支都是另一個數據庫表。 例如:

tree = {
    "_id": "111",
    "field1": "",
    "field2": "",
    "field3": {
        "_id": "333",
        "_parent_id": "111",
        "field3_1": "",
        "field3_2": "",
        "field3_3": [
            {
                "_id": "1",
                "_parent_id": "333",
                "field3_3_1": ""
            },
            {
                "_id": "2",
                "_parent_id": "333",
                "field3_3_1": ""
            },
            {
                "_id": "3",
                "_parent_id": "333",
                "field3_3_1": ""
            }
        ]
    }
}

應該對應於 3 個表:tree、field3 和 field3_3——它們在 _id 和 _parent_id 上有關系。 每個分支可以是單個值、表或對象,基本上樹是動態結構,對應於 PostgreSQL 數據庫中的某些數據結構。 我正在使用 jdbc 將數據插入數據庫。 當用戶可能提供具有多個分支或多個分支值的大樹時,插入此類數據的最佳方法是什么? 我在考慮這樣的聲明:

                 with first_insert as(
                 insert into sample(firstname, lastname)
                 values('fai55', 'shaggk')
                 RETURNING id
                 ),

                 second_insert as(
                 insert into sample1(id, adddetails)
                 values
                 ((select id from first_insert), 'ss')
                 RETURNING user_id
                 )

但是如果內部插入應該處理大批量記錄(field3_3 將包含每個數據行的 100k 記錄),問題就會出現。

我已經使用 PreparedStatement 和 executeBatch() 在單個數據庫級別實現了接受表和插入的方法,並且效果很好。 像這種方法一樣的東西,可用於樹木?

如果樹是動態結構,我認為您必須將收到的 json 解析為可以在 Java 中工作的內容。

這樣的事情可以使用和JSONObject來實現。 假設您將傳入的 json 序列化為String data 然后你可以使用:

JSONObject dataJson = new JSONObject(data);

現在您可以在 Java 中使用這個樹結構。 您可以使用dataJson.toString()將其序列化回或創建自定義序列化程序。

如果問題是插入大小,您可以遍歷dataJson並將其拆分為合理的塊。 例如你可以使用這樣的東西

        JSONArray jsonArr = dataJson.getJSONArray("field3");
        JSONArray dataAccumJsonArr = new JSONArray();
        for (int i = 0; i < jsonArr.length(); i++) {
            dataAccumJsonArr.put(jsonArr.get(i));
            if (dataAccum.length() > 999) {
                doInsert(dataAccumJsonArr);
                dataAccumJsonArr = new JSONArray();
            }
        }
        doInsert(dataAccumJsonArr);

我通過以下方法解決了這個問題:我從樹的一個級別獲取元素,並將其所有非對象值插入到 prepareStatement 批處理中(它們在一個表中),返回插入的記錄 ID。 然后我取每個插入元素的子元素,分配正確的 parent_id 並將它們批量插入另一個表,然后再插入另一個表。 效果很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM