在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 )。
清單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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的在Oracle中使用JDBC插入功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外国ddos平台测试(外国ddos平台)
- 下一篇: solr创建索引_Solr:创建拼写检查