Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC批插入到具有外键的多个表_Java_Jdbc_Insert_Batch Processing_Relation - Fatal编程技术网

Java 使用JDBC批插入到具有外键的多个表

Java 使用JDBC批插入到具有外键的多个表,java,jdbc,insert,batch-processing,relation,Java,Jdbc,Insert,Batch Processing,Relation,我正在编写一个方法,该方法接收树结构并将其插入数据库,其中每个分支都是另一个数据库表。 例如: tree = { "_id": "111", "field1": "", "field2": "", "field3": { "_id": "333", "_parent_id": "111", "field3_1": "", "field3_2": "", "field3_3": [

我正在编写一个方法,该方法接收树结构并将其插入数据库,其中每个分支都是另一个数据库表。 例如:

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": ""
            }
        ]
    }
}
应该对应于三个表: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
                 )
但是,如果内部insert处理大批量记录(field3_3将为每个数据行包含100k条记录),那么问题就会出现


我已经使用PreparedStatement和executeBatch()实现了在单个DB级别上接受表和插入的方法,效果非常好。类似于此方法的任何内容,可用于树?

如果树是动态结构,我认为您必须将收到的json解析为可以在Java中使用的内容

这样的事情可以通过使用和。假设您在
字符串数据中序列化了传入的json。然后您可以使用:

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);
JSONArray jsonArr=dataJson.getJSONArray(“field3”);
JSONArray dataAccumJsonArr=新的JSONArray();
for(int i=0;i999){
doInsert(数据采集器);
dataAccumJsonArr=新的JSONArray();
}
}
doInsert(数据采集器);

我通过以下方法解决了问题: 我从树的一个级别获取元素,并将其所有非对象值插入preparedStatement批处理中(它们位于一个表中),返回插入的记录ID。然后我获取每个插入元素的子元素,分配正确的父元素id,并将它们批量插入到另一个表和另一个表中。很好