`

java操作Oracle类型XMLType

阅读更多

java操作Oracle类型XMLType总结一:使用jdbc

java操作Oracle类型XMLType总结二:使用Mybatis

对于XMLType类型的使用,本人也是第一次,因为它不是一个通用的数据库类型,因此在使用过程中碰到诸多问题,在这里作一下总结,以备忘。

先来了解一下什么是XMLType类型。

XMLType是Oracle从9i开始特有的数据类型,是一个继承了Blob的强大存在,可以用来存储xml并提供了相当多的操作函数。理论上可以保存2G大小的数据。

那怎么样通过java来插入XMLType类型的数据呢?项目当中采用的是Mybatis,总是出现莫名的异常,都搞不清楚到底是Mybatis的问题还是jdbc本身的问题,所以打算一步步来,先搞定jdbc,再解决Mybatis。在折腾了半天之后,发现jdbc操作主要有3种方法:

一、在Java中把XMLType当作字符串String来用,具体创建XMLType的任务完全交给数据库:
1
2
3
4
String sql = "insert into xmltable (XML) values(sys.xmlType.createXML(?))";  
String xmldata = "<label>This is an XML fragment</label>";  
ps.setString(1, xmldata);  
ps.executeUpdate();

此方法会使数据库的压力偏大,因为此方法简单又不需要额外的依赖,在一开始采用此方法,但在实际使用过程中发现,在内容的长度超过4000左右的时候,会抛出:ORA-01461: can bind a LONG value only for insert into a LONG column 异常。一开始以为使用mybatis的原因,使用jdbc测试依然如此,使用诸多方法尝试无解。在项目中使用该大字段不可能只保存长度在4000以内的数据,这样使用varchar2足矣,所以该方法淘汰。

二、使用CLOB类型来操作。XMLType是继承了CLOB的存在,所以是可以通过CLOB来操作的。方法是在客户端创建好CLOB数据后传入数据库通过Oracle的XMLTYPE()函数来构造XMLType的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String sql = "insert into xmltable (XML) values(XMLType(?))";  
String xmldata = "<label>This is an XML fragment</label>"; 
//通过conn创建CLOB
CLOB tempClob = CLOB.createTemporary(connection, false, CLOB.DURATION_SESSION);
//打开CLOB
tempClob.open(CLOB.MODE_READWRITE);
//获得writer
Writer clobWriter = tempClob.setCharacterStream(100);
//写入数据
clobWriter.write(xmldata);
//刷新
clobWriter.flush();
//关闭writer
clobWriter.close();
//关闭CLOB
tempClob.close();
 
pst.setObject(1, tempClob);

此方法客户端和数据库同时承担了创建XMLType的任务,因此压力较平均,也没有超过长度的问题。但是在实际使用过程中又发现,xml的内容头部不能包含以下信息:

<?xml version="1.0" encoding="UTF-8"?>

否则会抛出异常:PI names starting with XML are reserved

先不说少了这个在以后处理xml内容包含中文时会不会遇到蛋疼的乱码问题,光是看着就让人感觉不爽,且需求上也要求保存,没办法,这个方法又行不通了。

三、使用Oracle提供的oracle.xdb.XMLType类,客户端创建XMLType后直接把对象传给数据库:
1
2
3
4
5
6
7
8
9
Connection conn = ... ;//获得Connection  
PreparedStatement ps = ...;//获得PreparedSatement  
String sql = "insert into xmltable (XML) values(?)";  
String xmldata = "<label>This is an XML fragment</label>";  
//创建一个XMLType对象  
XMLType xmltype = XMLType.createXML(conn, xmldata);  
 
ps.setObject(1, xmltype);  
ps.executeUpdate();

此方法将创建XMLType的任务完全交给了客户端,因此客户端的压力大,数据库压力小。在实测过程中,需要添加两个jar包,不然会报找不到类的错误:

xdb.jar

xmlparserv2.jar

需要注意这jar包又没版本标注,很容易弄错,一开始我下载了个xdb.jar,怎么弄都不对提示找不到某个类,查看之后发现是属于oracle更早期版本,重新下载了一个xdb.jar后正常。

以上三种方法通过插入20万条数据测试比较发现:

第一种方法:耗时最短,服务器cpu消耗最大

第二种方法:耗时最长,服务器cpu消耗居中

第三种方法:耗时居中,服务器cpu消耗最小

 

至此,jdbc操作XMLType类型数据终于算是小小的搞定了,不用说采用了第三种方案,但是项目中基本都不会直接用jdbc来操作,像当前项目中就采用了Mybatis,上面也讲到了使用Mybatis总是出现异常,查看了下Mybatis也没有对XMLType的实现,看来还有的折腾,不过jdbc已经搞定,思路已经清晰了不是?

分享到:
评论

相关推荐

    java中xml文件的处理及oracle中xmltype的插入和读取.pdf

    java中xml文件的处理及oracle中xmltype的插入和读取.pdf

    Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据

    XMLType是Oracle支持的一种基于XML格式存储的数据类型,这里我们共同来探究Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据的方法:

    java中xml文件的处理及oracle中xmltype的插入和读取.docx

    。。。

    Oracle PL/SQL programming(5th Edition)

    The new edition covers calls to Java methods from within PL/SQL programs, autonomous transactions, object type inheritance, and the new Timestamp and XMLType data types. There’s also more ...

    ODAC 4.5.2.19

    Oracle Data Access Components08-Oct-03 New features in ODAC 4.50-------------------------------------------------- - XMLTYPE datatype support added - WideString support added to work with Unicode ...

    PLSQL Developer238页中文版使用手册

    4.6包声明和JAVA会话声明 4.7查看结果 4.8查看DBMS_OUTPUT 4.9查看HTP输出 4.10调试 4.11跟踪运行 4.12回归测试 5优化 5.1使用解释计划窗口 5.2自动统计 5.3PL/SQL概览图 5.4SQL跟踪 6专用SQL 6.1使用...

    PLSQL Developer用户指南

    4.6 包声明和 JAVA 会话声明 ........23 4.7 查看结果集 .......24 4.8 查看 DBMS_OUTPUT ...24 4.9 查看 HTP 输出 ....24 4.10 调试 .24 4.11 跟踪运行 .........28 4.12 回归测试 .........29 5. 优化...30 5.1 ...

    pl/sql操作手册

    pl/sql 7.1操作手册,中文,总共239页 目录 目录..............................................................................................................................................................

    PLSQL_Developer7.0中文帮助手册

    6.7 查看和编辑 XMLTYPE 列..44 6.8 直接查询导出..........44 6.9 保存 SQL 脚本..........44 6.10 创建标准查询..........45 7. 命令窗口...............................46 7.1 输入 SQL 语句和命令....46 7.2 ...

    plsql中文使用说明

    4.3 变量类型......................................................21 4.4 保存测试脚本..................................................22 4.5 跟踪运行时间错误.............................................

    PLSQL_Developer_9.0用户指南

    3. 登录到一个ORACLE数据库 .........................................................................................................15 4. 编写程序 .........................................................

    PLSQL中文手册(相当全面)

    4.3 变量类型......................................................21 4.4 保存测试脚本..................................................22 4.5 跟踪运行时间错误.............................................

    plsql developer 中文使用手册 最新 7.0 plsql developer 使用手册(中文)

    4.3 变量类型......................................................21 4.4 保存测试脚本..................................................22 4.5 跟踪运行时间错误.............................................

    plsql developer 7.0 最新中文手册(下载前请务必看说明)

    developer 数据库工具的操作, 目录 目录.............................................................................................................................................................3 1....

Global site tag (gtag.js) - Google Analytics