Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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 使用DMSDK从Marklogic批量摄取数据到RDBMS_Java_Marklogic_Marklogic 9 - Fatal编程技术网

Java 使用DMSDK从Marklogic批量摄取数据到RDBMS

Java 使用DMSDK从Marklogic批量摄取数据到RDBMS,java,marklogic,marklogic-9,Java,Marklogic,Marklogic 9,我需要使用DMSDK将大量数据从MarkLogic插入RDBMS 下面是我的代码示例 ArrayList<ArrayList<String>> batch = new ArrayList<ArrayList<String>>(); DatabaseClient client = DatabaseClientFactory.newClient(config.getmlHost(), config.getmlPort(), new DatabaseCl

我需要使用DMSDK将大量数据从MarkLogic插入RDBMS

下面是我的代码示例

ArrayList<ArrayList<String>> batch = new ArrayList<ArrayList<String>>();
DatabaseClient client = DatabaseClientFactory.newClient(config.getmlHost(), config.getmlPort(), new DatabaseClientFactory.BasicAuthContext(dbConfig.getuser(), dbConfig.getpassword()));
QueryManager queryMgr = client.newQueryManager();
StructuredQueryBuilder sb = queryMgr.newStructuredQueryBuilder();
StructuredQueryDefinition criteria = sb.and(sb.collection("collection1"),sb.collection("collection2"))
DataMovementManager dmm = client.newDataMovementManager();
QueryBatcher batcher = dmm.newQueryBatcher(criteria)
        .withBatchSize(10)
        .withThreadCount(12)
        .onUrisReady(
                        new ExportListener()
                        .onDocumentReady(doc -> {
                    logger.info("URI received : " + doc.getUri());
                    try {
                        //Getting data From xml and adding it into a arraylist for batch creation
                        ArrayList<String> getDataXml = new GetDataXml().GetDatafromXml(doc.getContent(new DOMHandle()),
                                dbuilder, xPath, ColumnNames);
                        batch.add(getDataXml);

                    } catch (Exception e) {
                        logger.error("Error in the Code", e);
                    }
                })).onQueryFailure(exception -> {
                    logger.error(exception);
                });
        dmm.startJob(batcher);
        batcher.awaitCompletion();
        dmm.stopJob(batcher);
        Class.forName("Driver Name");

        //connecting to RDBMS
        Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)
        PreparedStatement pstmt = conn.prepareStatement("INSERT INTO DBNAME VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");

        //Creating Batches PreparedStatement.addBatch()
        for(ArrayList<String> eachObject : batch) {             
            createPreparedStatement(pstmt, eachObject).addBatch();
        }

        //
        int[] result = pstmt.executeBatch();
        logger.info("Total Records Inserted " + result.length);
        oracle.closeConnect(oracleConn);

public PreparedStatement createPreparedStatement(PreparedStatement pstmt, ArrayList<String> eachObject)
            throws SQLException {
        for (int i = 0; i < eachObject.size(); i++) {
            pstmt.setString(i + 1, eachObject.get(i));
        }
        return pstmt;
    }
ArrayList batch=new ArrayList();
DatabaseClient client=DatabaseClientFactory.newClient(config.getmlHost(),config.getmlPort(),newdatabaseclientfactory.BasicAuthContext(dbConfig.getuser(),dbConfig.getpassword());
QueryManager queryMgr=client.newQueryManager();
StructuredQueryBuilder sb=queryMgr.newStructuredQueryBuilder();
StructuredQueryDefinition标准=sb和(sb集合(“集合1”)、sb集合(“集合2”))
DataMovementManager dmm=client.newDataMovementManager();
QueryBatcher batcher=dmm.newQueryBatcher(标准)
.带批量大小(10)
.withThreadCount(12)
奥努里斯雷迪先生(
新的ExportListener()
.onDocumentReady(文档->{
info(“收到的URI:+doc.getUri());
试一试{
//从xml获取数据并将其添加到arraylist以进行批创建
ArrayList getDataXml=new getDataXml().GetDatafromXml(doc.getContent(new DOMHandle()),
dbuilder、xPath、ColumnNames);
add(getDataXml);
}捕获(例外e){
记录器错误(“代码错误”,e);
}
})).onQueryFailure(异常->{
记录器错误(异常);
});
dmm.startJob(配料器);
batcher.waiting completion();
dmm.停止作业(配料器);
类别名称(“司机姓名”);
//连接到RDBMS
Connection conn=DriverManager.getConnection(数据库URL、用户、通行证)
PreparedStatement pstmt=conn.prepareStatement(“插入数据库名值(?,,,,,,,,,,,,,,?)”;
//正在创建批处理PreparedStatement.addBatch()
对于(ArrayList eachObject:batch){
createPreparedStatement(pstmt,eachObject).addBatch();
}
//
int[]result=pstmt.executeBatch();
logger.info(“插入的总记录”+结果.length);
oracle.closeConnect(oracleConn);
公共PreparedStatement createPreparedStatement(PreparedStatement pstmt,ArrayList eachObject)
抛出SQLException{
for(int i=0;i
此代码仅从MarkLogic获取数据,并且在完成一个批处理后不会插入RDBMS数据库,可以在代码中的任何一个点上my mistak。
提前感谢。

开始作业之前,请考虑创建一条准备好的语句,并在onDocumentReady()侦听器中:

  • 从文档中提取一个或多个值
  • 将准备好的语句上的占位符设置为值,以及
  • 执行准备好的语句
  • 在一个数组中累积所有文档的策略的缺点是,该数组可能会耗尽所有可用内存,如果数据库操作是交错的,吞吐量应该会更好


    希望这能有所帮助,

    我建议您尝试使用DMSDK和JDBC编写自己的管道。谢谢您的回复,您上面提到的步骤将在RDBMS中逐个插入数据,但不是成批插入数据?可以在一条准备好的语句中插入多行--请参阅--但最好的方法通常是一次插入一批行,而不是一次插入所有行。我确实需要成批插入,但这是一种错误我不太明白,这件事不会发生。根据您所说的,DMSDK代码正在检索数据。问题在于准备好的声明。对于一批中检索到的每个文档,准备好的语句应提供一个附加行,如上面链接的SO答案中所述。