2011-11-24 34 views
2

我有一个存储过程,旨在插入单行。我就可以以下列方式(例如简化)操作与Hibernate:带存储过程的休眠批处理

public void store(int param1, int param2) { 
    Connection con = session.connection(); // obtain JDBC connection from Session object 
    CallableStatement stmt = con.prepareCall("{ call changesalary(?,?) }"); 
    stmt.setInt(1, param1); // first parameter index start with 1 
    stmt.setInt(2, param2); // second parameter 
    stmt.execute(); // call stored procedure 
    cleanup(con, stmt); 
} 

我不知道是否有可能重新使用在多个批次的一致好评方式这个存储过程,而无需修改它(我不有可能添加新的存储过程或修改现有的)。我想这样做:

public void batchStore(int[] params1, int[] params2) { 
    for (int i = 0; i < params1.length; i++) { 
     store(params1[i], params2[i]); 
    } 
} 

public void store(int param1, int param2) { 
    Connection con = session.connection(); 
    CallableStatement stmt = con.prepareCall("{ call changesalary(?,?) }"); 
    stmt.setInt(1, param1); 
    stmt.setInt(2, param2); 
    stmt.execute(); 
    cleanup(con, stmt); 
} 

但为了避免大量调用数据库的,我宁愿要准备一套报表,那后来我批到数据库中的一个电话:

public void store(int[] params1, int[] params2) { 
    Connection con = session.connection(); 
    CallableStatement[] stmts = new CallableStatements[params.size]; 

    for (int i = 0; i < params1.length; i++) { 
     CallableStatement stmt = con.prepareCall("{ call changesalary(?,?) }"); 
     stmt.setInt(1, params1[i]); 
     stmt.setInt(2, params2[i]); 
     stmts[i] = stmt; 
    } 

    con.executeStatements(stmts); 
} 

可以实现上面的伪代码吗?我可以通过这样做来提高性能吗?

回答

2

实际上你在做的是使用JDBC来执行你的SQL(即使你从Hibernate的会话中获得JDBC连接)。有了JDBC,你可以做类似这样的事情:

public void store(int[] params1, int[] params2) { 
    Connection con = session.connection(); 
    boolean initialAutocommitSetting = connection con.getAutoCommit(); 
    //disable autocommit 
    con.setAutoCommit(false); 
    //you only need one statement object: 
    CallableStatement stmt = con.prepareCall("{ call changesalary(?,?) }"); 

    for (int i = 0; i < params1.length; i++) {  
     stmt.setInt(1, params1[i]); 
     stmt.setInt(2, params2[i]); 
     //for each call, add the set of parameters as needed and call addBatch(); 
     stmt.addBatch(); 
    } 
    //when you're done, execute your (batch) statement and see how many updates you got 
    int [] updatesCount=stmt.executeBatch(); 

    //manually commit 
    con.commit(); 

    if(updatesCount!=i) { 
     //some updates didn't work 
    } 

    //return connection to initial autocommit setting: 
    connection.setAutoCommit(initialAutocommitSetting); 
} 

希望这会有所帮助。 Javadocs:CallableStatementStatement

+0

谢谢,工作完美! – aksamit