2013-07-25 15 views
5

Bu INSERT INTO table_a (a_id, a_name) VALUES (5, 'a5'),(6, 'a6'); gibi sql üretmek hazırda bekletme gerekir. Eğer 1 deyimi ile 2 satır ekleyebilir böyle SQL ileBir deyimde birden çok değer eklemek için SQL üretecek HQL nasıl yapılır?

. Ben birçok ilişki için bir set tasarruf zaman,

a_id, a_name 

------------------ 
5  a5 
6  a6 

hazırda olsun birden insert deyimi ile ekleyecektir hazırda bekletme.

INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (1, 'a'); 
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (2, 'a'); 
.... 
... 
.. 
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (1000, 'a'); 

Ve geçen süredir:

Executed 1,000 queries; elapsed time (seconds) - Total: 0.78, SQL query: 0.78, Building output: 0 

Ve aynı değerlerle test kullanımı Bu 1000 satır için 1 HQL ile tablo böyle bir şey sonuçlandı olacak eklerseniz neden olacaktır SQL INSERT INTO table_a (a_id, a_name) VALUES (5, 'a'),(6, 'a'),(),...,...,(1000, 'a'); böyle geçen süre sonuçlandı olacaktır:

Query 1 of 1, Rows read: 0, Elapsed time (seconds) - Total: 0.02, SQL query: 0.02, Building output: 0 

benim testin sonucu 1000 değerine (0.02s) 1 beyanı daha hızlı yaklaşık 39 kez alınmayacak mı'dan 1000 ekleme ifadesi ile hibernate gibi 1 değerine (0.78s) sahiptir. Yani eklemek veya belki de güncelleştirmek için SQL gibi SQL üreten bir yöntem var. Yoksa bu, hazırda bulunan lehçeyi geçersiz kılmamız gereken anlamına mı geliyor? herhangi bir ipucu

cevap

0

için

Teşekkür Sen sıfır olmayan bir değere hibernate.jdbc.batch_size özelliğini ayarlayabilirsiniz. Hazırda bekletme işleminin toplu INSERT kullanmasına izin verecektir. a official documentation'a bir göz atın.

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i < 10000; i++) { 
    RecordA record = new RecordA(.....); 
    session.save(record); 
    if (i % BATCH_SIZE == 0) { // BATCH_SIZE is your choice, but equal to property 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 
tx.commit(); 
session.close(); 

Ayrıca burada ele var:

Aşağıdaki kod hazırda aracılığıyla JDBC toplu uçlar kullanmak nasıl elde edileceğini Hibernate batch size confusion

+1

olarak bildiğim kadarıyla, batch_size ayarı bellek sızıntısı kalmadan roundtrip aza indirmek için hafıza optimizasyon meselesidir. ** insert, bir işlemde ** hala birden fazla ifadedir **. bu yüzden batch_size buradaki çözüm değildir. Yine de teşekkürler .. – Angga

+0

[Hazırda bekletme boyutu karışıklığı] (http://stackoverflow.com/questions/6687422/hibernate-batch-size-confusion) 'da belirtildiği gibi, "hibernate.jdbc.batch_size", JDBC2 API'sini kullanmanıza izin verir. birincil anahtar ** 'GenerationType.Identity' değilse çok ** ile bir ifadesine ** özdeş imza ile ** ardışık ** INSERT deyimleri ** (tablo ve sütun) birleştirir özelliği. –

+0

evet ve ** ardışık INSERT ifadeleri **, ** tek INSERT ifadesi ** ile farklıdır. ve benim yorumumda daha önce de söylediğim gibi, ** bir işlemde eklenti hala birden fazla ifadedir **. – Angga

0

HQL destekleyen tek INSERT ......... SEÇ .........; INSERT INTO ……… VALUES yazabilme şansı yok, yani ekleme sorgusunu yazarken, diğer tablodan değerler seçmemiz gerekiyor, kendi değerlerimizi manuel olarak ekleyemiyoruz. (see documentation ve this)

İlgili konular