[英]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.