在Oracle中使用JDBC插入功能

介绍

在本文中,我将显示一个示例,说明如何使用Oracle支持的JDBC批量插入功能,这些功能特定于Oracle。

有关为什么可能希望一般使用批量插入的更多详细信息,例如,在某些情况下需要考虑性能,请参阅Joormana Brahma于2015年4月12日发表的JCG文章“ JDBC Batch Insert Example ”。

Brahma女士提供了3个示例,说明如何使用MySQL在JDBC中完成此功能,但是我在本文中展示的特定于Oracle的方式可以看作是她的第二个示例与第三个示例之间的交叉,例如,PreparedStatement之间的混合和批处理批次。

Oracle安装程序

为了利用本例中显示的支持JDBC批量插入的Oracle特定功能,您首先需要在Oracle数据库中创建几个用户定义的类型。

第一种类型映射到表中要批量插入的记录,第二种类型映射到第一种类型的变量数组。 换句话说,您可以将第一种类型视为表中的一行,而第二种类型只是这些行的数组。

您将使用支持JDBC批量操作的Oracle特定功能将这个数组批量插入表中,本文将对此进行演示。

因此,在此示例中创建的第一件事是Oracle中的表( 请参见下面的清单1 )。

DROP TABLE "SYSTEM"."EMPLOYEE";
CREATE TABLE "SYSTEM"."EMPLOYEE" (  "FIRST_NAME" VARCHAR2(20 BYTE), "LAST_NAME" VARCHAR2(20 BYTE),"EMP_NO" NUMBER, "JOIN_DATE" DATE) 
TABLESPACE "SYSTEM" ;

清单1.用于创建“ Employee”表的DDL

该表是HR模式中Employees表的简化版本,Oracle在Application Express中将其用作示例。 请注意,清单1中的示例是由System用户创建的-对于实际使用而言并不现实,但是在这里满足我们的目的就足够了,例如,除了varchar2之外,在数字和日期等字段中还混合了SQL类型。

接下来,我们需要创建一个用户定义的类型,该类型映射到该表中的行( 请参见下面的清单2 ),例如,请注意,它与清单1中的Employee表中的字段具有直接关系。

create or replace
TYPE t_type AS OBJECT (first_name varchar2(20),last_name varchar2(20),emp_no number,join_date date
);

清单2.创建“ t_type ”对象的PL / SQL

然后,我们需要创建另一个用户定义的类型,该类型映射到第一个类型的变量数组( 请参见下面的清单3 )。

create or replace
type tb_t_type
as varray (1000000) of t_type;

清单3.创建“ tb_t_type ”对象的PL / SQL

请注意,此处定义的数组最大大小为100万。 您可以调整此大小以适合自己的需求(当然,在您自己的资源限制内),但是我们确实会在这里的JDBC示例中批量插入100万条记录。

最后,我们将需要创建由批量操作调用的存储过程( 请参见下面的清单4 )。

create or replace
procedure add_employees (emparray in tb_t_type) asbeginforall i in emparray.first .. emparray.lastinsert into EMPLOYEE( first_name,                last_name,emp_no,join_date )values( emparray(i).first_name,emparray(i).last_name,emparray(i).emp_no, emparray(i).join_date );end add_employees;

清单4.创建“ add_employees”存储过程的PL / SQL

请注意,在此PL / SQL中使用了forall习惯用法,这使得实际的大容量插入操作比仅使用普通香草“ for循环”时可能的情况快了大约一半数量级。 特别是在我自己的演示运行,我已经注意到了forall成语产生的结果这是大约快5倍。

注意:在此示例中,我已在运行Windows 7 Home Premium的Dell笔记本电脑上使用Oracle Database Express Edition 11g第2版,该笔记本电脑具有Intel i5处理器@ 1.7GHz,8GB RAM。 对于Oracle JDBC驱动程序,我使用了ojdbc6.jar

JDBC

完成Oracle设置后,现在我们来看看如何利用支持JDBC批量插入操作的Oracle特定功能( 请参见下面的清单5 )。

图片1

清单5. Java示例,说明支持JDBC批量插入操作的Oracle特定功能

分析

请注意第2-4行的import语句,即,它们是ojdbc6.jar定义的特定于Oracle的类型,这在本示例前面提到的就是利用特定于Oracle的功能进行JDBC批量插入。

如第12行的注释所示,要做的第一件事是获取我们的数据源。 请注意,对于第14-16行,您将需要用自己的值代替主机,端口和服务ID(“ sid”),尽管如果使用默认端口,则仅为1521。

在第22-23行,我们定义了一个Oracle STRUCT数组,该数组映射到我们先前在Oracle数据库中创建的用户定义类型“ tb_t_type ”( 请参见清单3 )。 同样在第22行,我们从命令行获取此变量数组的大小,即,在大容量插入操作中以100万条记录运行此示例,如下所示:

java OraBulk 1000000

在第26行,我们定义了Oracle struct描述符,该描述符映射到我们先前在Oracle数据库中创建的用户定义类型“ t_type ”( 请参见清单2 )。

接下来在第29-31行,我们准备准备批量插入的记录数组。 在此示例中,完成操作的方式有些人为设计,例如,雇员的加入日期只是该元素在循环中被迭代的时间,尽管有其技巧,但对于我们的目的来说已经足够了。

在第35-36行,我们定义了Oracle数组描述符,该描述符映射到用户定义的类型“ tb_t_type ”( 请参见清单3 ),并通过引用在第23行中定义的Oracle结构来实例化Oracle数组。

在完成所有先决条件工作之后,接下来我们在第39行创建Oracle预准备语句,以引用我们先前在Oracle数据库中定义的存储过程( 请参见清单4 )。 然后,它将Oracle数组设置为其第一个参数( 请参见第40行 )。

最后,在完成所有设置后,我们在第43行几乎没有大张旗鼓地执行了准备好的语句。

完成主要事件后,第46-48行的反高潮限制是强制提交和关闭以释放资源。 请注意,如果在批量插入期间发生异常,那么所有内容都会被回滚,因为默认情况下自动提交将处于关闭状态。

摘要

在我的基准测试运行中,在运行Windows 7 Home Premium的Dell笔记本电脑上,使用此代码在Oracle Database Express Edition 11g第2版中批量插入1百万条记录的时间为12.55秒,该笔记本电脑具有Intel i5处理器@ 1.7GHz和8GB RAM。 对于Oracle JDBC驱动程序,我使用了ojdbc6.jar

  • 您可以下载代码和样品PL / SQL 这里的JCG

翻译自: https://www.javacodegeeks.com/2015/12/using-the-jdbc-insert-features-in-oracle.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css语法和规则

语法: Selector{sRule!important;} 说明: 提升指定样式规则的应用优先权。 IE6及以下浏览器有个比较显式的支持问题存在,!important并不覆盖掉在同一条样式的后面的规则。请看下述代码: 示例代码: div{color:#f00!impo…

vue 代理重定向_关于vue-router,路由重定向的使用分析

看之前的项目,突然发现一个不算bug的bug,之前也是一直没有想到,现在发现之后越来越觉得有必要改掉,项目用的是vue做的,自然切换用的就是路由,一级路由包括:首页、记录和个人中心,二级…

WebMagic爬取58同城租房数据

WebMagic爬取58同城租房数据 1.WebMagic webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料。 webmagic的主要特色: 完全模块化的设计,强大…

python xposed_Xposed及类Xposed框架收集

常见xposed框架xposed--原生Cydia for Androidmagisk--挂载magisk.imgvitrualXposed--双开技术EXposed --太极VAEXposedVirtualHook :VirtualHook 修改 VirtualApp 的核心代码,提供 Hook 注入代码的窗口VirtrualApp --多开LEB 的平行空间 --双开大师360的DroidPlugi…

[bzoj3532][Sdoi2014]Lis

来自FallDeram的博客,未经允许,请勿转载,谢谢。 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci。请删除若项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案。如果…

java静态导入_Java中越来越多地接受静态导入吗?

java静态导入曾经有一段时间,至少在礼貌的社会中,人们普遍认为使用“ 不是 ”一词是不可接受的。 确实,在那个时候(也许直到今天),很多人确实(也确实)不认为这不是一个真实的词。 尽…

Vue+ECharts的小示例

VueECharts做数据可视化1. Vue Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现…

将MongoDB集成到您的Spring项目

本文展示了如何通过注释配置将MongoDB集成到您的spring项目中。 我们将从Gradle配置开始。 group com.gkatzioura.spring version 1.0-SNAPSHOTbuildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugi…

汇编学习笔记(3)-80x86指令集

前言 (1)指令的一般格式 [标号:] 助记符 [操作数1 , [操作数2]] [; 注释] 一行一条指令 助记符就是指令的名称,每条指定必定有个助记符。 助记符前面的标号是给汇编编译器看的,由我们自己取名,一般取表示本…

osg 三维gis开发_三维GIS平台的可视化应用 (下)

上一篇主要对三维GIS的基础数据和三维模型进行了一点说明,本篇将接着聊剩下的部分,主要是三维GIS平台能够支持什么样的场景展示,并来对平台的应用进行一些介绍。没看过上篇的朋友可以先了解一下再看本篇:MonoLog:三维G…

Servlet拦截器

Servlet拦截器1.LoginFilter package main.java.filter;import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException;public class LoginFi…

前端HTML介绍

一、HTML简介HTML定义:  超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符&#xff…

huffman编码的程序流程图_Huffman编码实现压缩解压缩

这是我们的课程中布置的作业。找一些资料将作业完毕,顺便将其写到博客,以后看起来也方便。原理介绍什么是Huffman压缩Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压缩方法,在压缩过程中不会丢失信息熵。并且能…

solr创建索引_Solr:创建拼写检查器

solr创建索引在上一篇文章中,我谈到了Solr Spellchecker的工作原理,然后向您展示了其性能的一些测试结果。 现在,我们将看到另一种拼写检查方法。 与其他方法一样,此方法使用两步过程。 相当快速的“候选单词”选择,然…

5000元性价比高的笔记本_2018性价比笔记本电脑品牌推荐 5000左右笔记本性价比推荐...

对于年年都出新款的电子产品,购买者们每年都经历一回挑花眼的时刻,那2018有什么笔记本比较好呢?宏碁暗影骑士3参考价:5099元内存容量:8G  显存容量:2G  硬盘容量:128G1T显卡型号:GTX1050(高…

Hibernate模糊查询

Hibernate模糊查询1.不使用hql DetachedCriteria criteria DetachedCriteria.forClass(User.class);if (StringUtils.isNotEmpty(yh)) {criteria.add(Restrictions.or(Restrictions.eq("yhid", yh),Restrictions.like("yhxm", yh, MatchMode.ANYWHERE)))…

带有Javaslang的Java 8中的功能数据结构

Java 8的lambda(λ)使我们能够创建出色的API。 它们令人难以置信地提高了语言的表达能力。 Javaslang利用lambda来基于功能模式创建各种新功能。 其中之一是功能性集合库,旨在替代Java的标准集合。 (这只是鸟瞰图,您…

丰田pcs可以关闭吗_丰田车必备的配置有哪些是在亚洲龙上体现了?

亚洲龙基于丰田TNGA架构下的GA-K平台打造而来,与雷克萨斯ES一致,先期推出搭载2.5L自然吸气发动机以及2.5L混合系统的车型。作为一汽丰田的全新旗舰轿车,亚洲龙主销车型配备丰田TSS规避碰撞辅助套装,英文全拼为 “Toyota Safety Se…

[NOIP2014]飞扬的小鸟

思路{ 对于每一列,小鸟或下落,或上升。那我们很容易想到对应的背包问题! 按照完全背包的思想更新上升部分,01背包的方法更新下降部分。 撞到柱子了(aluba。。。。。。aluba.。。。。。)不慌,只需把它设为不可打即可&am…

2020 dns排名_2020年新版全球/全国各地ISP的DNS服务器地址表

【第一】国内外知名的公共DNS服务器(排列不分先后):腾讯公共DNS(119.29.29.29、182.254.116.116)阿里公共DNS(223.5.5.5、223.6.6.6)百度公共DNS(180.76.76.76)360安全DNS(123.125.81.6)Google(8.8.8.8、8.8.4.4)114DNS(114.114.114.114、114.114.115.115)OpenDNS(2…