2011-05-16 81 views
0

的情況是這樣的:避免JDBC調用

for loop // runs say 200000 times 
{ 
    // here, i do a select from a database, fetching few rows which are expected to increase with every new iteration of for loop 
    // currently i am doing this select using simple JDBC call (using JDBC only is NOT a requirement) 

    // then i do some string matching stuff and then i either insert or update a particular row (in 95% cases i will insert) 
    // this insert or update is being done using Hibernate (using Hibernate over here is a requirement) 
} 

所以,問題是,在每一個循環,我必須要考慮每一個先前插入/更新的行。由於這個要求,我必須在每個循環中執行JDBC調用。這個JDBC調用正在最大限度地減少性能。

我想知道,是否有任何方法使用它我不必在每次迭代中進行JDBC調用,但是仍然可以考慮所有記錄,包括前一個插入/更新中的記錄?像緩存或一些內存中的數據結構或類似的東西?

下面是代碼:

for loop // runs say 2000 times 
{ 
    String query = pdi.selectAllPatients(patientInfo); 
    Statement st = conn.createStatement(); 
    ResultSet patientRs = st.executeQuery(query); 

    while (patientRs.hasNext()) 
    { 
     // some string ops 
    } 

    // Create session for DB No.2 
    Session sessionEmpi = sessionFactoryEmpi.getCurrentSession(); 
    sessionEmpi.beginTransaction(); 

    if(some condition) 
     patientDao.insertPatient(patientInfo, sessionEmpi); 
    else 
     patientDao.insertref(patientInfo.getref(), sessionEmpi); 

    conn.commit(); 
} 

public int insertPatient(PatientInfo input, Session session) throws SQLException { 

    try { 

     session.save(input.getPatient()); 
     session.flush(); 
     session.save(input.getref()); 
     session.getTransaction().commit(); 

     return 1; 

    } catch (Exception ex) { 
     session.getTransaction().rollback(); 
     ex.printStackTrace(); 
     return 0; 
    } 
} 
+0

你確定你在java中使用nhibernate嗎? – abalogh 2011-05-16 14:48:06

+0

我正在使用Hibernate,而不是nhibernate。 – Bhushan 2011-05-16 14:49:53

+1

然後不要標記'nhibernate'。我刪除它。至於具體的問題,你在使用連接池嗎?獲得一個unpooled連接成本至少200毫秒,獲得一個池連接基本上是一個沒有操作。 – BalusC 2011-05-16 14:51:09

回答

0

是對SELECT一致的性能?除非您的數據相當小,否則緩存內存中的所有更改可能會遇到問題。您也可以批量選擇,有效展開循環。