मैं एक आवेदन की विलंबता के संवेदनशील हिस्से पर काम कर रहा हूँ, मूल रूप से मैं एक नेटवर्क घटना डेटा को बदलने और उसके बाद डीबी में सभी डेटा सम्मिलित प्राप्त होगा। प्रोफाइलिंग के बाद मैं देखता हूं कि मूल रूप से मेरा पूरा समय डेटा को बचाने की कोशिश कर रहा है।उच्च प्रदर्शन हाइबरनेट सम्मिलित
Save: 27
Commit: 9
Save: 27
Commit: 9
Save: 26
Commit: 9
Save: 36
Commit: 9
Save: 44
Commit: 0
यह मेरे लिए भ्रामक है: यहाँ कोड
private void insertAllData(Collection<Data> dataItems)
{
long start_time = System.currentTimeMillis();
long save_time = 0;
long commit_time = 0;
Transaction tx = null;
try
{
Session s = HibernateSessionFactory.getSession();
s.setCacheMode(CacheMode.IGNORE);
s.setFlushMode(FlushMode.NEVER);
tx = s.beginTransaction();
for(Data data : dataItems)
{
s.saveOrUpdate(data);
}
save_time = System.currentTimeMillis();
tx.commit();
s.flush();
s.clear();
}
catch(HibernateException ex)
{
if(tx != null)
tx.rollback();
}
commit_time = System.currentTimeMillis();
System.out.println("Save: " + (save_time - start_time));
System.out.println("Commit: " + (commit_time - save_time));
System.out.println();
}
संग्रह के आकार हमेशा 20. कम से कम यहाँ है समय डेटा है कि मैं देख रहा है। मुझे लगता है कि save
त्वरित होना चाहिए और हर समय commit
पर खर्च किया जाना चाहिए। लेकिन स्पष्ट रूप से मैं गलत हूँ। मैंने लेनदेन को हटाने की भी कोशिश की है (यह वास्तव में जरूरी नहीं है) लेकिन मैंने खराब समय देखा ... मैंने hibernate.jdbc.batch_size = 20 सेट किया है ...
मैं 500 से अधिक संदेश/सेकंड प्राप्त करने की उम्मीद कर सकता हूं तो मुझे 20 मिलीसेकंड से कम होने के लिए एकल संदेश हैंडलिंग की आवश्यकता है।
मैं इस ऑपरेशन की जरूरत होने के लिए जितनी जल्दी हो सके, आदर्श वहाँ केवल डेटाबेस के लिए एक गोल यात्रा होगी। मैं यह कैसे कर सकता हूँ?
बीटीडब्लू, क्या आपको 'फ्लशमोड # कभी नहीं' का उपयोग करते समय 'फ्लश()' के बाद 'प्रतिबद्ध() 'माना जाना चाहिए? –
@ पास्कल थिवेंट। मुझे नहीं पता :-) – luke
ठीक है, 'लेनदेन # प्रतिबद्ध() 'के जावडोक को पढ़ें :) –