资讯网站优化排名,如何自己建一个公司网站,北京到安阳的火车,网站推广手段有哪些介绍 在本文中#xff0c;我将显示一个示例#xff0c;说明如何使用Oracle支持的JDBC批量插入功能#xff0c;这些功能特定于Oracle。 有关为什么可能希望一般使用批量插入的更多详细信息#xff0c;例如#xff0c;在某些情况下需要考虑性能#xff0c;请参阅Joormana … 介绍 在本文中我将显示一个示例说明如何使用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.7GHz8GB RAM。 对于Oracle JDBC驱动程序我使用了ojdbc6.jar 。 JDBC 完成Oracle设置后现在我们来看看如何利用支持JDBC批量插入操作的Oracle特定功能 请参见下面的清单5 。 清单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