Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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 XML到JSON转换[oracle.xdb.XMLType到JSON对象]性能问题_Java_Xml_Json_Oracle_Xmltype - Fatal编程技术网

Java XML到JSON转换[oracle.xdb.XMLType到JSON对象]性能问题

Java XML到JSON转换[oracle.xdb.XMLType到JSON对象]性能问题,java,xml,json,oracle,xmltype,Java,Xml,Json,Oracle,Xmltype,应用程序模型为UIJavaServerSideOracleStoredProcedures[DB] 我检索从存储过程XML输出接收到的XML数据,并将其作为JSON对象传递给UI 这是片段 import oracle.xdb.XMLType; import org.json.JSONObject; XMLType studentsdataXML = null; JSONObject xmlJSONObj = null; studentsdataXML = (XMLType) callable

应用程序模型为UIJavaServerSideOracleStoredProcedures[DB]

我检索从存储过程XML输出接收到的XML数据,并将其作为JSON对象传递给UI

这是片段

import oracle.xdb.XMLType;
import org.json.JSONObject;

XMLType studentsdataXML = null;
JSONObject xmlJSONObj = null;

studentsdataXML = (XMLType) callableStatement.getObject(5);

String xmlString = studentsdataXML.getString();
xmlJSONObj = XML.toJSONObject(xmlString); // using org.json library

//return xmlJSONObj ;
上面的代码运行良好,将XML转换为JSON对象,但是性能问题在于执行
studentsdataXML.getString()
大约需要总执行时间的四分之三[从UI返回UI]

问题是我是否可以直接进行XML到JSON的转换?[oracle.xdb.XMLType到JSON对象] 或针对不同图书馆的任何建议

使用的org.json库:

Update1:
getString()
更新为
getStringVal()
ie:
String xmlString=studentsdataXML.getStringVal()

getStringVal()

本文建议使用getStringVal()获取字符串值-

另外,时间测量片段:

…执行查询检索XML的总时间(毫秒):1308

XML对象到字符串转换的总时间(毫秒):31452

XML字符串到JSON转换的总时间(毫秒):423

更新2:另一个SO线程存在类似问题,但未解决-

更新3:


当我在关闭连接后调用
getStringVal()
时,我得到了一个异常-
java.sql.SQLRecoverableException:Closed connection

几个月前我遇到了一个类似的问题,在对oracle.xdb包进行了一周多的搜索、测试和抓取之后,我找到了一个有效的解决方案。在我的场景中,我有一个表示大XML的字符串,并希望将其转换为XMLType,以便将其保存到数据库中的XMLType列中。由于我需要一个辅助的
oracle.sql.CLOB
作为
XMLType.createXML
方法的参数传递,我创建了这个方法:

private CLOB createClobFromStringStreaming(字符串xml,连接连接)抛出SQLException,IOException{
CLOB CLOB=CLOB.createTemporary(conn,false,CLOB.DURATION\u会话);
BufferedReader br=新的BufferedReader(新的StringReader(xml));
char[]buffer=new char[1024/*clob.getChunkSize()*/];
int read=0;
Writer w=clob.setCharacterStream(0L);
试一试{
for(read=br.read(缓冲区);read>-1;read=br.read(缓冲区)){
w、 写入(缓冲区,0,读取);
w、 冲洗();
}
}捕获(IOE异常){
投掷e;
}最后{
试一试{
w、 冲洗();
w、 close();
br.close();
}捕获(IOE1异常){
抛出e1;
}
}
返回clob;
}
我没有尝试将整个字符串直接放入XMLType变量中,而是将其分成块并流式传输到变量中。在尝试了许多不同的块大小之后,我发现实现最高性能的最佳块大小是1024。我不知道为什么会发生这种情况,但这对我来说是最好的解决办法

之后,我只需要像这样调用该方法:

XMLType xml=XMLType.createXML(conn,this.createClobFromStringStreaming(this.eventXml,conn));
在此之后,我实现了正常的XMLType创建时间,而不是之前的4到10秒。
因此,您应该尝试类似的方法,但方向相反。例如,尝试使用
getClobVal()
从XMLType获取CLOB,然后将CLOB转换为字符串。我不确定您是否可以使用
getInputStream()
进行操作。您还必须尝试。

getString()方法中由于从db中提取或转换为字符串而花费的时间是多少?这是在转换为字符串时,因为我测量了
studentsdataXML.getString()前后的时间执行我说的是getString()内部发生的事情。ohhk,我将getString()更新为getStringVal()。但问题依然如此。根据文档,该方法从XMLType获取包含XML数据的字符串值。我更新了我的帖子。当您特别问这个问题时,我注意到根据API引发的异常,它说是SQLException。那么它是从DB拉过来的!?请参阅我的更新,以接受为答案,尽管我还没有尝试过完整的方法,但这些建议帮助了我
long stime1 = System.currentTimeMillis();
String xmlString = studentsdataXML.getStringVal();
long etime1 = System.currentTimeMillis();
log.info("Total time (in ms) for XML object to String conversion : " + (etime1 - stime1));
long stimexml = System.currentTimeMillis();
xmlJSONObj = XML.toJSONObject(xmlString);
long etimexml = System.currentTimeMillis();
log.info("Total time (in ms) for XML String to JSON conversion : " + (etimexml - stimexml));