2012-03-05 12 views
16

मुझे एक बार में डेटाबेस में हजारों रिकॉर्ड डालने की ज़रूरत है। मैं अपने आवेदन में वसंत जेडीबीसी टेम्पलेट का उपयोग कर रहा हूं।वसंत जेडीबीसी टेम्पलेट बैच का उपयोग कर डेटाबेस में एकाधिक प्रविष्टियां कैसे करें?

नीचे दिया गया कोड मैंने अभी तक लिखा है जो एक ही समय में सभी आवेषण निष्पादित करता है। इसलिए, यदि मैं 10,000 उपयोगकर्ताओं का आह्वान करता हूं तो उन्हें एक बार में डाला जाता है। लेकिन मैं चाहता हूं कि बैचों में उन्हें निष्पादित करना है उदाहरण के लिए एक बैच में 500 रिकॉर्ड रिकॉर्ड करें और इसी तरह।

@Override 
public void saveBatch(final List<Employee> employeeList) { 
    final int batchSize = 500; 

    getJdbcTemplate().batchUpdate(QUERY_SAVE, 
      new BatchPreparedStatementSetter() { 
       @Override 
       public void setValues(PreparedStatement ps, int i) 
         throws SQLException { 
        Employee employee = employeeList.get(i); 
        ps.setString(1, employee.getFirstname()); 
        ps.setString(2, employee.getLastname()); 
        ps.setString(3, employee.getEmployeeIdOnSourceSystem()); 
       } 

       @Override 
       public int getBatchSize() { 
        return employeeList.size(); 
       } 
      }); 

} 

कैसे इतना है कि बजाय employeeList.size की() बैच आकार के रूप में हम कहते हैं कि 500, उन्हें अमल के रूप में बैच का आकार है और फिर अगले 500 और इतने पर कर सकते हैं मैं ऊपर कोड बदल सकता हूँ?

कृपया मदद करें।

+0

मैं जानता हूँ कि इस सवाल है काफी पुराना है, लेकिन मेरे पास एक सवाल है। आपने 'GetBatchSize' विधि में 500 क्यों नहीं लौटाया? –

उत्तर

21

मुझे यकीन नहीं है कि क्या आप अकेले जेडीबीसी टेम्पलेट का उपयोग कर ऐसा कर सकते हैं। हो सकता है कि आप बैच आकार के हिस्सों में बड़ी सूची को स्लाइस करके, चरणों में batchUpdate विधि का आह्वान कर सकें। उप-सूचियों प्राप्त करने के लिए उपयोग Google Guava Lists.partition को छोड़कर,

@Override 
public void saveBatch(final List<Employee> employeeList) { 
    final int batchSize = 500; 

    for (int j = 0; j < employeeList.size(); j += batchSize) { 

     final List<Employee> batchList = employeeList.subList(j, j + batchSize > employeeList.size() ? employeeList.size() : j + batchSize); 

     getJdbcTemplate().batchUpdate(QUERY_SAVE, 
      new BatchPreparedStatementSetter() { 
       @Override 
       public void setValues(PreparedStatement ps, int i) 
         throws SQLException { 
        Employee employee = batchList.get(i); 
        ps.setString(1, employee.getFirstname()); 
        ps.setString(2, employee.getLastname()); 
        ps.setString(3, employee.getEmployeeIdOnSourceSystem()); 
       } 

       @Override 
       public int getBatchSize() { 
        return batchList.size(); 
       } 
      }); 

    } 
} 
14

मैं जानता हूँ कि यह थोड़ी देर हो चुकी है, लेकिन आप @adarshr क्या कर रहा है के लिए इसी तरह कुछ कर सकते हैं:

यहाँ एक नज़र डालें।

public void saveBatch(final List<Employee> employeeList) { 
    final int batchSize = 500; 
    List<List<Employee>> batchLists = Lists.partition(employeeList, batchSize); 

    for(List<Employee> batch : batchLists) { 
     getJdbcTemplate().batchUpdate(QUERY_SAVE, new BatchPreparedStatementSetter() { 
      @Override 
      public void setValues(PreparedStatement ps, int i) 
        throws SQLException { 
       Employee employee = batch.get(i); 
       ps.setString(1, employee.getFirstname()); 
       ps.setString(2, employee.getLastname()); 
       ps.setString(3, employee.getEmployeeIdOnSourceSystem()); 
      } 

      @Override 
      public int getBatchSize() { 
       return batch.size(); 
      } 
     }); 
    } 
} 
0

फिर भी सरल तरीका getBatchsize() विधि को संशोधित किया गया है नीचे में रूप में अच्छी तरह

काम करता है विभाजन या सूची :) के उप-समूह की कोई जरूरत नहीं है,

@Override 
public void saveBatch(final List<Employee> employeeList) { 
    final int batchSize = 500; 
    getJdbcTemplate().batchUpdate(QUERY_SAVE, 
      new BatchPreparedStatementSetter() { 
       @Override 
       public void setValues(PreparedStatement ps, int i) 
         throws SQLException { 
        Employee employee = employeeList.get(i); 
        ps.setString(1, employee.getFirstname()); 
        ps.setString(2, employee.getLastname()); 
        ps.setString(3, employee.getEmployeeIdOnSourceSystem()); 
       } 

       @Override 
       public int getBatchSize() { 
        if (batchSize > employeeList.size()) { 
         return employeeList.size(); 
        } 
        return batchSize; 
       } 
      }); 
} 
+0

यह काम नहीं करेगा, लेकिन केवल डीबी में पहले 500 रिकॉर्ड डालें। – ngeek

3
Spring provide Batch operations with multiple batches 
here 100 is batch size. 


public class JdbcActorDao implements ActorDao { 

    private JdbcTemplate jdbcTemplate; 

    public void setDataSource(DataSource dataSource) { 
     this.jdbcTemplate = new JdbcTemplate(dataSource); 
    } 

    public int[][] batchUpdate(final Collection<Actor> actors) { 
     int[][] updateCounts = jdbcTemplate.batchUpdate(
       "update t_actor set first_name = ?, last_name = ? where id = ?", 
       actors, 
       100, 
       new ParameterizedPreparedStatementSetter<Actor>() { 
        public void setValues(PreparedStatement ps, Actor argument) throws SQLException { 
         ps.setString(1, argument.getFirstName()); 
         ps.setString(2, argument.getLastName()); 
         ps.setLong(3, argument.getId().longValue()); 
        } 
       }); 
     return updateCounts; 
    } 

    // ... additional methods 

} 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद। यह बहुत साफ दिखता है। मुझे कुछ संदेह थे: 1) बैचअपडेट विधि 2 की प्रतिक्रिया के रूप में 2 डी सरणी का अर्थ क्या है) क्या हम आवेदन चलाने के दौरान क्रॉस चेक कर सकते हैं कि वास्तव में बैच में डीबोरेशन चल रहा है? – Ankit

संबंधित मुद्दे