admin 管理员组

文章数量: 887021


2024年1月16日发(作者:网页json怎么看)

第32卷第1期 佳木斯大学学报(自然科学版) Vol_32 No.1 2014年O1月 Journal of Jiamusi University(Natural Science Edition) Jan. 2014 文章编号:1008—1402(2014)01-0116—03 袁勇 (遵义师范学院网络管理中心。贵州遵义563000) 摘要: 随着云计算、物联网时代的到来,大对象数据的存储和读取将是不得不面对的现实,系 统化的数据管理才能使我们的工作事半功倍.本文讨论利用SQL Plus存储过程或借助JAVA 编程语言,来实现了Oracle数据库中大对象数据存取,并对其操作的时间性能进行对比,得出借 助JAVA语言读取Oracle数据库大对象远优于通过存储过程读取的结论. 关键词: 大对象;存取;时间性能 中图分类号:TP3l1.13 文献标识码:A O 引 言 BLOB; ②指向操作系统的目录:BFILE,建立目录、文 当代,大数据无处不在,和云计算、物联网一样 件的映射关系 已经成为计算机学科中的一个热门研究课题.随着 高清图像、视频的问世,大容量的存储空间和大数 2 Oracle中大对象数据存取的实现方法 据的操作越来越需要研究者去攻克.本文只是针对 本章通过Oracle自带的SQL Plus以及用当 大对象数据在Oracle数据库中的存取着手,利用 前广泛使用的JAVA语言来实现Oracle数据库中 SQL Plus或借助JAVA编程语言,来实现了Ora. 图片数据的存取.首先在Oraclel0g数据库中新建 ck数据库中大对象数据存取操作,并对两种方法 测试用表 ]. 进行存取时间性能比较,为大对象在Oracle数据 create table pie 1ob 库中的存取提出一些自己的见解. (t—id varchar2(3O)not null, t—pic blba not nul1); 1 Oracle中大对象数据分类 创建文件操作目录,用于大对象数据的存取. 为了解决数据库中非结构化数据存取问题, create or replace directory Pic a8 D:\test.//设置目录 Oracle提出了LOB(Large Object),即大对象的概 设置好操作目录后,需要将目录的读、写权限赋予我们登陆数 念,包含图像、音视频、文件等非结构化的数据.这 据库的用户. 类数据最大特点是:大小不确定,长度变化,要想在 Grant write(read)on directory Pic tO scott; 数据库中进行存取,就必须使用到LOB E . 2.1利用PL/SQL实现存取 1.1按数据类型分类 船 以下为两个PL/SQL存储过程,分别用来向数 ①字符类型:包含CLOB和NLOB; 据库中存储、读取大对象数据.可以根据修改具体 ②二进制类型:BLOB,用来存储较大,且无结 的filename名,像数据库中插入图片、视频等数据. 构的二进制数据; 具体如下: ③二进制文件类型:BFILE,将数据在外部操 2.1.1存人大对象的存储过程: 作系统文件中进行存储; create or replace procedure pic—insert( 1.2按存取方式分类 tid varchar2. iflename varchar2)a8 ①数据在内部表空间存储:CLOB、NLOB以及 bf bfile: ①收稿日期:2013—11—18 作者简介:袁勇(1986一),男,贵州遵义人,遵义师范学院网络管理中心网络工程师,硕士研究生.研究方向:数字优化仿真技术及应用 

1 bl0b b1ob。 _:Orac1e数据库大对象数据存取的两种实现方法及时间性能比较 117 JAVA语言由于其跨平台等众多优点,在当前具有 较大的应用市场,也是众多编程爱好者首选的开发 _begin insert into pielob vs]ues(tid,empty_blob())return T_pic in- to b_lob;//插人数据,空大对象 bf:=biflename( PIC.filename);//filname为插人大对象的 语言.在这里,通过JDBC来访问oracle数据库,实 现其存取.主要实现代码如下: 文件名 dbms_lob.fileopcn(bf,dbms_lob.file_readonly); dbms_Iob.1oadfremfile(b lob,bf,dbms_lob.getlength(bf)); dbms—lob.fileclose(bf); commit; end; 2.1.2读取的存储过程: create or replace procedure pic—read( pinto varchar2,ponm varchar2)is l_.file UTL.nLE.FILEJ PE; l_buffer RAW(32767); l_amount BINARY_INTEGER:=1: l_pos INTEGER:=1; l—bl0b BLOB: l—b1oh_len IN rEGER; BEC1N SELEcT T.PlC INTO l_blob FROM pic—lob WHERE T ID=pinto; l__blob_len:=DBMS_LOB.GETLENGTH(1_blob);//获取大对 象长度 l__file:=UTL_FILE.FOPEN( PIC;ponm, ̄b;32767); WHILE l_pus<l_blob_len LOOP//通过循环,将大对象一位一 位读取出来 DBMS_LOB.READ(1_blob,l amount,l_pos,l_buffer); uTL.FIEL.PULRAW(1』le,l-buffer,TRUE); l_pos: l_pos+lamount; _END LOOP; u I'L—nLE.FCLOSE(1_file);//关闭文件读写 ExCEP110N//异常处理 WHEN OTHERS THEN IF UTL_FILE.IS—OPEN(1-6le)THEN U’rL_FILE.FCLOSE(1_file); ENDIF; ARISE; END; 在完成存储过程的创建后,通过执行exec pic— insert或exec pic—read存储过程,并加上相应的实 际参数完成大对象的读取. 2.2借助JAVA编程语言实现高效读取 由于使用PL/SQL存储过程读取的效率太低 (见第三章),通常的系统开发都会选择使用高级 程序语言,其具有界面友好、可读性强等优势,而 2.2.1存人大对象的JAVA函数片段: public static void main(String[]args){ try{ String URL=”jdbc:oracle:thin:@localhost:1521:ZYNC”: Class.forNarne(”oracle.jdbc.driver.OracleDriver”);//驱动的 加载 Connection cnt=DriverManager.getConnection( URL,”scott”,”tiger”);//获取数据库连接 cnt.setAutoCommit(false);//关闭自动提交 Statement smt=cut.createStatement(); OutputStream OS=null; smt.exeouteUpdate(”insert into pic—lob(t—id,t—pic)values( 012.empty_blob())”);∥插入空大对象 ResultSet rst=srn1.exeeme0uery(”select l_pic from pie—lob where t_id= 012 for update”);//对空对象进行更新 if(rat.next()) { oracle.sq1.BLOB blob=(oracle.sq1.BLOB)rst.getBlob(”t— pic”); OS=blob.getBinaryOutputStream(); InputStrcam is=new FilelnputStream(”D:、test、Mountain. jpg”); //指定输入数据流 inti=0; while((i_is.reda())!=一1) {OS.write(i);} } OS.flush(); OS.close();//关闭数据流 cnt.commit();//执行提交 uot.setAutoCommit(true); }catch(Exception e){ e.printStackTrace(); }} 2.2.2读取大对象的JAvA函数片段: public static void main(String[]args) { try{ String URL=”jdbc:oracle:thin:@localhost:1521:ZYNC”: Clsas.forName(”oarcle.jdbc.dirver.OraclcDriver”);//驱动的 加载 Connection cnt=DriverManager.getConnection( URL,”scott”,”tiger”);//获取数据库连接 Statement smt=cnt.createStatemcnt(); ResuhSet rst=smt.executeQuery(”select t—pie from pic—lob where t—id= 012 ’);//执行查询 if(rst.next()) 

l18 { 佳木斯大学学报(自然科塑版L 2014卑 表示执行速度太长或太短,对结论不影响,而未做 该项试验.): Ol ̄cle. .BLOB blob=(oracle.sq1.BLOB)rat.getBlob(1); InputStreamis=blob.getBinaryStream(); FileOutputStream fos=new FileOutputStream(”E:\outputimage. JPg”); 表1存取时间对比表(单位:s) //指定文件输出位置 inti=0: while((i=is.read())!=一1) {fos.write(i);} los.flush(); 注:存储读取时间根据不同运行环境,存在差 异. ls.colose();//关闭数据流 } }catch(Exception e){ e.printStackTrace(); }} 由上表可知,在进行大对象的存取过程中,通 过混合编程写人数据流的方式在读取方面远优于 存储过程,而在存人时性能低于存储过程. 3存取时间性能比较 在性能分析过程中,以图片(30.8KB\ 4546KB,JPG格式)、视频(422MB,MP4格式)的存 4 总 结 本文通过BLOB大对象在oracle数据库中的 存取为背景,通过使用存储过程的方式和用JAVA 取为例,在执行SQL水Plus存储过程时,加入以下的 命令获取存储过程执行时的系统时间,比较执行前 后的执行时间差值,从而得出存储过程的运行时长. select to—与Oracle混合编程的实现方式,作出系列实验研 究.得出用JAVA与Oracle}昆合编程的方式在读取 大对象的过程中,远优于通过存储过程实现的结 论. char(current—timestamp(5),1[)D— MON—YYYY HH24:MI:SSxFF )from dual; 在java连接oracle数据库读取大对象的函数中 加入函数currentTimeMillis()来获取执行的系统时 间,通过执行前后系统时间差来得出读取的时长. 1ong sysDate=System.eurrentTimeMillis();//放在程序头 long sysDatel=System.currentTimeMillis();//放在程序尾 long sysDate2=sysDatel—sysDate; 参考文献: [1] 金杰.基于OCCI技术存取数据库大对象的方法及实现[J] .计算机系统应用,2010。19(7):162—165. [2]余秋明.浅论大型数据对象在Oracle数据库中的存储方法 [J].科技广场,2008,10:61—63. [3]张文东,刘培刚.基于Java与Oracle数据库的图像处理技术 [J].计算机系统应用,2004,11:34—36. [4] 王彬,代彦波,颜鹏博.Oraclel0g简明教程[M].北京:清华 大学出版社,2006. System.out.prinfln(”运行时问:”+sysDate2+”ms”);//打印 程序时长. 在存储过程、JAVA混合编程下分别运行三 次,取平均数据得到耗时表如下(打斜线表格栏: Two Methods of Storage and Retrieval LOB in Oracle Database and Its Time Performance Comparison YUAN (Network Management Center,zunyi Normal College,Zunyl 563000,China) Abstract: With the development of cloud computing,internet of things,large object data storage and re— trieval will be forced to face,and systematic data management can make our work more effective.This article discussed the use of SQL Plus storage procedure or with the JAVA programming language,to achieve storage and retrieval of LOB in Oracle database,and its operation time performance compared.Finally,the conclusion that using JAVA language is far better han sttorage procedure to read LOB in Oracle was made. Key words:LOB;storage and retrieval;time performance 


本文标签: 数据 对象 存取 过程 读取