- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
应用程序模型是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 到 JSON 对象]或对可以执行此操作的不同库的任何建议
使用的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));
...执行查询检索 XML 的总时间(以毫秒为单位):1308
XML 对象到字符串转换的总时间(以毫秒为单位):31452
XML 字符串到 JSON 转换的总时间(以毫秒为单位):423
Update2:另一个有类似问题的 SO 线程,但未得到答复 - Slow to convert Oracle 11g XMLType into Java String or Document
更新3:
当我在关闭连接后调用 getStringVal()
时,出现异常 - java.sql.SQLRecoverableException: Closed Connection
最佳答案
几个月前我遇到了类似的问题,经过一个多星期的搜索、测试和摸索 oracle.xdb 包,我找到了一个可行的解决方案。在我的场景中,我有一个代表大 XML 的字符串,并希望将其转换为 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;
}
我没有尝试将整个字符串直接放入 XMLType 变量中,而是将其分成 block 并将其流式传输到变量中。在尝试了多种不同的 block 大小之后,我发现实现最大性能的完美大小是 1024。我不知道为什么会发生这种情况,但这对我来说是最好的解决方案。
之后,我只需要调用这样的方法:
XMLType xml = XMLType.createXML(conn, this.createClobFromStringStreaming(this.eventXml, conn));
此后,我实现了正常的 XMLType 创建时间,而不是之前的 4 到 10 秒。因此,您应该尝试类似的方法,但方向相反。尝试使用 getClobVal() 等方法从 XMLType 获取 CLOB,然后将 CLOB 转换为字符串。我不确定您是否也可以使用 getInputStream()
做一些事情,您必须尝试一下。
关于java - XML 到 JSON 转换 [oracle.xdb.XMLType 到 JSON 对象] 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26515019/
我在将 xmltype 插入 pl/sql 指定位置的另一个 xmltype 时遇到问题。 第一个变量 v_xml 的形式为: 123 01-01-2015 第二个 v
我将 Oracle DB 中的 XMLType 文件加载到 Java 应用程序中。我准备了一个类来处理 XML 文件上的操作,如下所示: public class XMLDoc { private O
我有以下用 XmlType 属性装饰的基类 [Serializable] [XmlType("Base")] public class Base { [XmlElement(ElementNa
我有一个将 XML 存储在 Oracle 表中的应用程序 XMLType .我想对该数据进行全文搜索。 Oracle 文档,位于 Full-Text Search Over XML Data , 建议
我正在尝试输出 schemaLocation编码 xjc 时正确属性- 生成的类实例。根元素类如下所示: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(
我向 Oracle XML DB 专家提出了一个简短的问题: 我测量了几个大型xml文件的插入性能。理论上XMLType CLOB应该具有无与伦比的插入性能,因为插入的XML文档是直接写在一个字符大对
这是我目前使用的代码: SET serveroutput ON CREATE OR REPLACE PROCEDURE test_proc(i_xml varchar2) IS l_name VARC
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
我有一个简单的查询: WITH xtbl AS ( SELECT XMLTYPE ('1') AS xcol FROM DUAL ) SELECT XMLQUERY ('copy $tmp
我目前拥有非 utf-8 数据库,但我需要使用 utf-8 编码生成 XMLType 变量。我有一个解决方法,但 Oracle 中似乎存在错误,请参见以下链接: https://forums.orac
我想从 中选择数据XML 文件使用 Oracle SQL . 这是我的 XML 文件: 0
我有一个包含 XMLType 字段的表。该表是使用以下 DDL/DML 创建和加载的: CREATE TABLE T_ECO_test_LOG ( SECID NUMBER
在 java 中我想使用 oracle XMLType。我加了 XMLType type = new XMLType(conn, ""); 但我总是得到 Caused by: java.lang.Cl
我正在尝试将java字符串对象存储在javabean中,并尝试将其转换为xml格式。它存储成功,但每当我尝试从java bean获取数据时,我都会以简单字符串格式而不是xml格式收到数据。 请帮助我。
您好,序列化过程中这一行是什么意思? [XmlType(AnonymousType = true)] public class classname { } xsd.exe 为所有类生成它。我阅读了文档
是否可以将 javax.xml.bind.annotation.XmlType 转换为 XML 的字符串表示形式? 例子: 以下 Req 类来自第三方库,因此我无法覆盖 toString() 方法。
我有一个像这样的简单 xml: 0 Date @Today 1 Id 22 我想遍历每个参数,如果值以“@”开头,则调用一个函数,该函数将值作为参数并返回一
我想在 XML 文档上有一个 select 语句,其中一列应该返回我的每个节点的路径。 例如给定数据 SELECT * FROM TABLE(XMLSequence( XMLTYPE('
我正在做一项作业,我要考虑两种解决方案来存储网页中使用的文本。场景:一个类一个网页,一门课几堂课。 第一个选择是普通的关系型数据库,这个可以。 另一种选择是具有两个“正常”属性和一个具有 Oracle
作为尝试学习 WCF 的一部分,我正在阅读有关序列化的内容。我正在努力了解如何在 .NET 3.5 中控制序列化。例如,我有一个带有一些公共(public)属性的简单类。通过将 DataContrac
我是一名优秀的程序员,十分优秀!