Java XML到JSON转换[oracle.xdb.XMLType到JSON对象]性能问题
应用程序模型为UIJavaServerSideOracleStoredProcedures[DB] 我检索从存储过程XML输出接收到的XML数据,并将其作为JSON对象传递给UI 这是片段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
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));