2011-11-24 65 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