2016-05-07 3 views
10

जबकि jdbcTemplate.batchUpdate (...) चल रहा है, मैं देख सकता हूं कि डीबी पंक्ति गणना धीरे-धीरे बढ़ी है (तालिका में गिनती (*) चलकर), शुरुआत में 2k फिर 3k और 10k तक चला जाता है। 2k और 3k सटीक संख्याएं नहीं होती हैं कभी-कभी मुझे 2357 और 4567 मिलते हैं।वसंत jdbcTemaplate एक शॉट में डीबी 2 सर्वर को पूर्ण बैच आकार कैसे भेजना है?

मुझे एक शॉट में 10 के पंक्तियों (बैच आकार) की अपेक्षा की जा रही थी। मेरी समझ में अगर शुरुआत में मुझे पंक्ति गणना 0 मिलती है तो अगली पंक्ति गणना 10k होनी चाहिए। मैं प्रदर्शन कारण के लिए एक-एक करके सम्मिलित नहीं करना चाहता हूं, यही कारण है कि बैचअपडेट सुविधा का उपयोग किया जाता है और ऐसा लगता है कि यह सभी एक शॉट में भी प्रतिबद्ध नहीं है।

मैं अपने बैचसाइज के लिए केवल एक बार डीबी सर्वर पर डेटा (10k पंक्तियां) भेजना चाहता हूं। इसके लिए मुझे कुछ भी कॉन्फ़िगरेशन में निर्दिष्ट करना चाहिए?

नीचे जिस तरह से मैं jdbcTemplate बैच अद्यतन लिख रहा हूं। बैचसाइज 10k है।

public void insertRows(...) { 
    ... 
    jdbcTemplate.batchUpdate(query, new BatchPreparedStatementSetter(){ 
    @Override public void 

    setValues(PreparedStatement ps, int i) throws SQLException { 
     ... 
    } 

    @Override public int getBatchSize() { 
     if(data == null){ 
      return 0; 
     } 
     return data.size(); 
    } 
    }); 
} 

संपादित करें: जोड़ा गया @Transactional isertRows विधि के लिए stiil मैं एक ही व्यवहार देख सकते हैं। ट्रांसकेशनल का उपयोग करके यह 10k पंक्तियों के बाद होता है, लेकिन जब मुझे यूआर के साथ गिनती दिखाई देती है (मेरे साथ mytable से गिनती (*) का चयन करें) यह डेटा को धीरे-धीरे अपडेट किया जा रहा है (2k 4k तो 10k तक)। इसका मतलब है कि डेटा सर्वर में सर्वर पर जाता है (शायद एक अलविदा)। मैं एक शॉट में सबकुछ कैसे भेज सकता हूं। This question सुझाव देता है कि यह mysql में पुनः लिखने के लिए बैक किए गए स्टेटमेंट्स का उपयोग करके हासिल किया जाता है, क्या हमारे पास डीबी 2 में भी कुछ समान है।

मैं डेटा स्रोत कार्यान्वयन com.ibm.db2.jcc.DB2BaseDataSource

+0

सवाल आप कहते हैं कि यह वादा नहीं करता है प्रदान की @tamasrev, मैं यह करता है कह रहा हूँ से पहले भी मैं उम्मीद – Vipin

+0

ओह, मैं अल्पज्ञता न्याय। क्षमा करें, ध्वज हटा दिया। –

+0

यदि मुझे लेनदेन लागू करना है तो कौन सा विशेष बैच अपडेट कर रहा है? मैं इसे एक ही अद्यतन में भी कर सकता हूं। – Vipin

उत्तर

0

कैसे नीचे दी गई विधि के बारे में उपयोग कर रहा हूँ? अपने मामले में nUpdates = 10,000 निर्दिष्ट करें। मैंने इसका परीक्षण करने की कोशिश नहीं की है। अगर यह काम नहीं करता है तो कृपया मेरा जवाब अनदेखा करें।

// the batch size is set in the BatchPreparedStatementSetter, the number of rows we want to process is equal to the nbUpdates parameter 
    public int[] batchUpdate(String sql, final long nbUpdates, final BatchPreparedStatementSetter pss) throws DataAccessException { 
     if (logger.isDebugEnabled()) { 
      logger.debug("Executing SQL batch update [" + sql + "]"); 
     } 

     return (int[]) execute(sql, new PreparedStatementCallback() { 
      public Object doInPreparedStatement(PreparedStatement ps) throws SQLException { 
       try { 
        int batchSize = pss.getBatchSize(); 
        InterruptibleBatchPreparedStatementSetter ipss = (pss instanceof InterruptibleBatchPreparedStatementSetter ? (InterruptibleBatchPreparedStatementSetter) pss 
          : null); 
        if (JdbcUtils.supportsBatchUpdates(ps.getConnection())) { 
         List<Integer> rowsAffected = new ArrayList<Integer>(); 
         for (int i = 1; i <= nbUpdates; i++) { 
          pss.setValues(ps, i - 1); 
          if (ipss != null && ipss.isBatchExhausted(i - 1)) { 
           if (logger.isDebugEnabled()) { 
            int batchIdx = (i % batchSize == 0) ? i/batchSize : (i/batchSize) + 1; 
            logger.debug("Batch exhausted - Sending last SQL batch update #" + batchIdx); 
           } 
           int[] res = ps.executeBatch(); 
           for (int j = 0; j < res.length; j++) { 
            rowsAffected.add(res[j]); 
           } 
           break; 
          } 
          ps.addBatch(); 
          if (i % batchSize == 0 || i == nbUpdates) { 
           if (logger.isDebugEnabled()) { 
            int batchIdx = (i % batchSize == 0) ? i/batchSize : (i/batchSize) + 1; 
            logger.debug("Sending SQL batch update #" + batchIdx); 
           } 
           int[] res = ps.executeBatch(); 
           for (int j = 0; j < res.length; j++) { 
            rowsAffected.add(res[j]); 
           } 
          } 
         } 
         int[] result = new int[rowsAffected.size()]; 
         for (int i = 0; i < result.length; i++) { 
          result[i] = rowsAffected.get(i).intValue(); 
         } 
         return result; 
        } else { 
         List<Integer> rowsAffected = new ArrayList<Integer>(); 
         for (int i = 0; i < nbUpdates; i++) { 
          pss.setValues(ps, i); 
          if (ipss != null && ipss.isBatchExhausted(i)) { 
           break; 
          } 
          rowsAffected.add(ps.executeUpdate()); 
         } 
         int[] rowsAffectedArray = new int[rowsAffected.size()]; 
         for (int i = 0; i < rowsAffectedArray.length; i++) { 
          rowsAffectedArray[i] = rowsAffected.get(i); 
         } 
         return rowsAffectedArray; 
        } 
       } finally { 
        if (pss instanceof ParameterDisposer) { 
         ((ParameterDisposer) pss).cleanupParameters(); 
        } 
       } 
      } 
     }); 
    } 
+0

jdbcTemplate.batchupdate आपके द्वारा प्रदान किए गए समान कोड का उपयोग करता है। मुझे लगता है कि यह प्रदर्शन में सुधार नहीं कर सकता है। – Vipin

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