在Oracle中使用JDBC插入功能
介紹
在本文中,我將顯示一個(gè)示例,說(shuō)明如何使用Oracle支持的JDBC批量插入功能,這些功能特定于Oracle。
有關(guān)為什么可能希望一般使用批量插入的更多詳細(xì)信息,例如,在某些情況下需要考慮性能,請(qǐng)參閱Joormana Brahma于2015年4月12日發(fā)表的JCG文章“ JDBC Batch Insert Example ”。
Brahma女士提供了3個(gè)示例,說(shuō)明如何使用MySQL在JDBC中完成此功能,但是我在本文中展示的特定于Oracle的方式可以看作是她的第二個(gè)示例與第三個(gè)示例之間的交叉,例如,PreparedStatement之間的混合和批處理批次。
Oracle安裝程序
為了利用本例中顯示的支持JDBC批量插入的Oracle特定功能,您首先需要在Oracle數(shù)據(jù)庫(kù)中創(chuàng)建幾個(gè)用戶(hù)定義的類(lèi)型。
第一種類(lèi)型映射到表中要批量插入的記錄,第二種類(lèi)型映射到第一種類(lèi)型的變量數(shù)組。 換句話(huà)說(shuō),您可以將第一種類(lèi)型視為表中的一行,而第二種類(lèi)型只是這些行的數(shù)組。
您將使用支持JDBC批量操作的Oracle特定功能將這個(gè)數(shù)組批量插入表中,本文將對(duì)此進(jìn)行演示。
因此,在此示例中創(chuàng)建的第一件事是Oracle中的表( 請(qǐng)參見(jiàn)下面的清單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.用于創(chuàng)建“ Employee”表的DDL
該表是HR模式中Employees表的簡(jiǎn)化版本,Oracle在A(yíng)pplication Express中將其用作示例。 請(qǐng)注意,清單1中的示例是由System用戶(hù)創(chuàng)建的-對(duì)于實(shí)際使用而言并不現(xiàn)實(shí),但是在這里滿(mǎn)足我們的目的就足夠了,例如,除了varchar2之外,在數(shù)字和日期等字段中還混合了SQL類(lèi)型。
接下來(lái),我們需要?jiǎng)?chuàng)建一個(gè)用戶(hù)定義的類(lèi)型,該類(lèi)型映射到該表中的行( 請(qǐng)參見(jiàn)下面的清單2 ),例如,請(qǐng)注意,它與清單1中的Employee表中的字段具有直接關(guān)系。
create or replace TYPE t_type AS OBJECT (first_name varchar2(20),last_name varchar2(20),emp_no number,join_date date );清單2.創(chuàng)建“ t_type ”對(duì)象的PL / SQL
然后,我們需要?jiǎng)?chuàng)建另一個(gè)用戶(hù)定義的類(lèi)型,該類(lèi)型映射到第一個(gè)類(lèi)型的變量數(shù)組( 請(qǐng)參見(jiàn)下面的清單3 )。
create or replace type tb_t_type as varray (1000000) of t_type;清單3.創(chuàng)建“ tb_t_type ”對(duì)象的PL / SQL
請(qǐng)注意,此處定義的數(shù)組最大大小為100萬(wàn)。 您可以調(diào)整此大小以適合自己的需求(當(dāng)然,在您自己的資源限制內(nèi)),但是我們確實(shí)會(huì)在這里的JDBC示例中批量插入100萬(wàn)條記錄。
最后,我們將需要?jiǎng)?chuàng)建由批量操作調(diào)用的存儲(chǔ)過(guò)程( 請(qǐng)參見(jiàn)下面的清單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.創(chuàng)建“ add_employees”存儲(chǔ)過(guò)程的PL / SQL
請(qǐng)注意,在此PL / SQL中使用了forall習(xí)慣用法,這使得實(shí)際的大容量插入操作比僅使用普通香草“ for循環(huán)”時(shí)可能的情況快了大約一半數(shù)量級(jí)。 特別是在我自己的演示運(yùn)行,我已經(jīng)注意到了forall成語(yǔ)產(chǎn)生的結(jié)果這是大約快5倍。
注意:在此示例中,我已在運(yùn)行Windows 7 Home Premium的Dell筆記本電腦上使用Oracle Database Express Edition 11g第2版,該筆記本電腦具有Intel i5處理器@ 1.7GHz,8GB RAM。 對(duì)于Oracle JDBC驅(qū)動(dòng)程序,我使用了ojdbc6.jar 。
JDBC
完成Oracle設(shè)置后,現(xiàn)在我們來(lái)看看如何利用支持JDBC批量插入操作的Oracle特定功能( 請(qǐng)參見(jiàn)下面的清單5 )。
清單5. Java示例,說(shuō)明支持JDBC批量插入操作的Oracle特定功能
分析
請(qǐng)注意第2-4行的import語(yǔ)句,即,它們是ojdbc6.jar定義的特定于Oracle的類(lèi)型,這在本示例前面提到的就是利用特定于Oracle的功能進(jìn)行JDBC批量插入。
如第12行的注釋所示,要做的第一件事是獲取我們的數(shù)據(jù)源。 請(qǐng)注意,對(duì)于第14-16行,您將需要用自己的值代替主機(jī),端口和服務(wù)ID(“ sid”),盡管如果使用默認(rèn)端口,則僅為1521。
在第22-23行,我們定義了一個(gè)Oracle STRUCT數(shù)組,該數(shù)組映射到我們先前在Oracle數(shù)據(jù)庫(kù)中創(chuàng)建的用戶(hù)定義類(lèi)型“ tb_t_type ”( 請(qǐng)參見(jiàn)清單3 )。 同樣在第22行,我們從命令行獲取此變量數(shù)組的大小,即,在大容量插入操作中以100萬(wàn)條記錄運(yùn)行此示例,如下所示:
java OraBulk 1000000在第26行,我們定義了Oracle struct描述符,該描述符映射到我們先前在Oracle數(shù)據(jù)庫(kù)中創(chuàng)建的用戶(hù)定義類(lèi)型“ t_type ”( 請(qǐng)參見(jiàn)清單2 )。
接下來(lái)在第29-31行,我們準(zhǔn)備準(zhǔn)備批量插入的記錄數(shù)組。 在此示例中,完成操作的方式有些人為設(shè)計(jì),例如,雇員的加入日期只是該元素在循環(huán)中被迭代的時(shí)間,盡管有其技巧,但對(duì)于我們的目的來(lái)說(shuō)已經(jīng)足夠了。
在第35-36行,我們定義了Oracle數(shù)組描述符,該描述符映射到用戶(hù)定義的類(lèi)型“ tb_t_type ”( 請(qǐng)參見(jiàn)清單3 ),并通過(guò)引用在第23行中定義的Oracle結(jié)構(gòu)來(lái)實(shí)例化Oracle數(shù)組。
在完成所有先決條件工作之后,接下來(lái)我們?cè)诘?9行創(chuàng)建Oracle預(yù)準(zhǔn)備語(yǔ)句,以引用我們先前在Oracle數(shù)據(jù)庫(kù)中定義的存儲(chǔ)過(guò)程( 請(qǐng)參見(jiàn)清單4 )。 然后,它將Oracle數(shù)組設(shè)置為其第一個(gè)參數(shù)( 請(qǐng)參見(jiàn)第40行 )。
最后,在完成所有設(shè)置后,我們?cè)诘?3行幾乎沒(méi)有大張旗鼓地執(zhí)行了準(zhǔn)備好的語(yǔ)句。
完成主要事件后,第46-48行的反高潮限制是強(qiáng)制提交和關(guān)閉以釋放資源。 請(qǐng)注意,如果在批量插入期間發(fā)生異常,那么所有內(nèi)容都會(huì)被回滾,因?yàn)槟J(rèn)情況下自動(dòng)提交將處于關(guān)閉狀態(tài)。
摘要
在我的基準(zhǔn)測(cè)試運(yùn)行中,在運(yùn)行Windows 7 Home Premium的Dell筆記本電腦上,使用此代碼在Oracle Database Express Edition 11g第2版中批量插入1百萬(wàn)條記錄的時(shí)間為12.55秒,該筆記本電腦具有Intel i5處理器@ 1.7GHz和8GB RAM。 對(duì)于Oracle JDBC驅(qū)動(dòng)程序,我使用了ojdbc6.jar 。
- 您可以下載代碼和樣品PL / SQL 這里的JCG
翻譯自: https://www.javacodegeeks.com/2015/12/using-the-jdbc-insert-features-in-oracle.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的在Oracle中使用JDBC插入功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 外国ddos平台测试(外国ddos平台)
- 下一篇: linux的yum源怎么配(linux的