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

时间:2014-10-22 18:56:12

标签: java xml json oracle xmltype

应用程序模型是UI< - > JavaServerside< - > Oracle StoredProcedures [DB]

我检索从存储过程XML-Out接收的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()时的性能问题大约需要执行时间的3/4 [来自UI返回到UI]。

问题是我是否可以直接进行XML到JSON的转换? [oracle.xdb.XMLType to JSON object] 或对可以执行此操作的不同库的任何建议

使用的

org.json库:http://www.json.org/java/

更新1:getString()更新为getStringVal() 即:String xmlString = studentsdataXML.getStringVal();

getStringVal() - http://docs.oracle.com/cd/B28359_01/appdev.111/b28391/oracle/xdb/XMLType.html#getStringVal__

本文建议使用getStringVal()来获取字符串值 - http://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb11jav.htm#g1039140

此外,时间测量片段:

...

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));

...执行查询到retreive XML的总时间(以毫秒为单位):1308

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

XML String to JSON转换的总时间(以毫秒为单位):423

Update2:另一个与某些问题类似的SO线程,但没有回答 - Slow to convert Oracle 11g XMLType into Java String or Document

UPDATE3:

在关闭连接后调用getStringVal()时,我收到异常 - java.sql.SQLRecoverableException: Closed Connection

1 个答案:

答案 0 :(得分:1)

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

private CLOB createClobFromStringStreaming(String xml, Connection conn) throws SQLException, IOException {
        CLOB clob = CLOB.createTemporary(conn, false, CLOB.DURATION_SESSION);       
        BufferedReader br = new BufferedReader(new StringReader(xml));
        char[] buffer = new char[1024/*clob.getChunkSize()*/];
        int read = 0;
        Writer w = clob.setCharacterStream(0L);
        try {
            for (read = br.read(buffer); read > -1; read = br.read(buffer)) {
                w.write(buffer, 0, read);
                w.flush();
            }
        } catch (IOException e) {
            throw e;
        } finally {
            try {
                w.flush();
                w.close();
                br.close();
            } catch (IOException e1) {
                throw e1;
            }
        }

        return clob;
    }

我没有尝试将整个String直接放入XMLType变量,而是将其分成块并将其流式传输到变量中。在尝试了许多不同的块大小之后,我发现最佳性能的完美尺寸是1024.我不知道为什么会发生这种情况,但它对我来说是最好的解决方案。

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

XMLType xml = XMLType.createXML(conn, this.createClobFromStringStreaming(this.eventXml, conn));

在此之后,我实现了XMLType创建的正常时间,而不是之前的4到10秒。 所以,你应该尝试类似的方法,但反方向。尝试使用例如getClobVal()从XMLType获取CLOB,然后将CLOB用于String。我不确定你是否可以对getInputStream()做些什么,你必须尝试。