2012-08-17 56 views
0

我有一个创建一个可插入一个新的猫以下PL/SQL块中的JDBC声明:转换PLSQL函数来处理,利用一个Oracle ARRAY

CREATE OR REPLACE PROCEDURE INSERT_NEW_CAT(AGE NUMBER, WEIGHT NUMBER, NAME VARCHAR2) 
AS 
BEGIN  
    INSERT INTO CATS(cat_id,age,weight,name) 
    VALUES(cat_id_sequence.nextval,age,weight,name); 
END INSERT_NEW_CAT; 

而且下面的Java模块批量插入这些猫:

CallableStatement statement = conn.prepareCall("{CALL insert_new_cat(?,?,?)}"); 
for(int i = 0; i < 50000;i++) 
{ 
    statement.setInt(1, i); 
    statement.setInt(2,i); 
    statement.setString(3,"Test"); 
    statement.addBatch(); 
    if(i % 16382== 0) //max value my batch can support on my hardware 
    { 
     statement.executeBatch(); 
    } 
} 

statement.executeBatch(); 

所以这个问题是我只能坚持700记录秒,这是很慢。我相信问题是我每行调用一次上述PL/SQL函数(或者每批次输入一次)。如何重新编写上述函数来获取这些语句的数组,并进行批量插入以将对函数的调用次数减少到N模16382 + 1?数据库是Oracle 10g。

+0

只是一个问题。如果您每100条记录执行一次批处理,而不是在16000条奇数记录之后执行,那么您认为它可能更具性能吗? – sethu 2012-08-17 15:16:38

+0

@sethu我相信对数据库的呼叫越多,性能就会越差,因此不会。也作为供参考性能不是一个字:) – Woot4Moo 2012-08-17 15:27:24

+0

表现最肯定是一个字。而且,我从记忆的角度来看更多。内存将被保留,直到您执行批处理。这可能会降低系统的速度。您可能需要尝试并获得正确的批量大小。 – sethu 2012-08-18 08:37:52

回答

0

我可以使用以下步骤来解决问题:

Oracle对象的创建,以引用我的猫属性:

Create Type age is table of number 
Create Type weight is table of number 
Create Type name is table of varchar(50) 

然后在我的Java代码,我做了以下内容:

ArrayDescriptor ageCollection = ArrayDescriptor.createDescriptor("AGE", conn); 
ArrayDescriptor weightCollection = ArrayDescriptor.createDescriptor("WEIGHT", conn); 
ArrayDescriptor nameCollection = ArrayDescriptor.createDescriptor("NAME", conn); 
int[] ageArray = new int[50000]; 
int[] weightArray = new int[50000]; 
String[] nameArray = new String[50000]; 
for(int i = 0; i <50000;i++) 
{ 
    ageArray[i]=i; 
    weightArray[i]=i; 
    nameArray[i] = "Test"; 
} 
ARRAY oraAge = new ARRAY(ageCollection,conn,ageArray); 
ARRAY oraWeight = new ARRAY(weightCollection,conn,weightArray); 
ARRAY oraName = new ARRAY(nameCollection,conn,nameArray);  

CallableStatement statement = conn.prepareCall("{CALL insert_new_cat(?,?,?)}"; 

statement.setObject(1,oraAge); 
statement.setObject(2,oraWeight); 
statement.setObject(3,oraName); 
statement.execute(); 
conn.commit(); 

SQL过程:

CREATE OR REPLACE PROCEDURE INSERT_NEW_CAT (age age, weight weight, name name) 
AS 
BEGIN 
    forall i in 1..age.last 
     insert into cats(id,age,weight,name) 
     vales(cat_sequence.nextval,age(i),weight(i),name(i); 
END INSERT_NEW_CAT; 

重要的是要注意行(年龄)是指我在oracle数据库中创建的年龄数据类型。通过执行上述操作,我能够将完全索引表上的插入提高到〜45000秒。在非索引表上,这个值变成〜70000每秒。

1

创建一个数据库对象类型:

CREATE TYPE CAT AS OBJECT(
    AGE NUMBER, WEIGHT NUMBER, NAME VARCHAR2 
); 

然后创建相同的集合类型:

CREATE TYPE CATS IS TABLE OF CAT; 

在你的PL/SQL程序接收猫的列表,并使用FORALL - >此对于性能非常重要。

从java使用StructDescriptorArrayDescriptor构建您的CAT对象和CATS集合。