2012-03-18 9 views
5

Bir SQLite Java kütüphanesi web sitesinden şu örneği kopyalanan otomatik tamamlama: Ben autoCommit()executeBatch() her iki tarafında geçiş önemini anlamak için mücadele ediyorumAçıklanması

PreparedStatement prep = conn.prepareStatement("insert into people values (?, ?);"); 
    prep.setString(1, "Gandhi"); 
    prep.setString(2, "politics"); 
    prep.addBatch(); 
    prep.setString(1, "Turing"); 
    prep.setString(2, "computers"); 
    prep.addBatch(); 
    conn.setAutoCommit(false); 
    prep.executeBatch(); 
    conn.setAutoCommit(true); 

. Her bir toplu işlem için sadece bir taahhüt yapılmasını engelliyor mu? Böylece tek bir 'toplu' taahhüt setAutoCommit(true) tarafından yapılacaktır.

Teşekkür ederiz.

+0

Buna yanıt olarak kabul edilen yanıttaki bazı bilgilerle çelişen bir yanıt ekledim. Bilginize. – Gray

cevap

8

Otomatik işlem devre dışı bırakılmadan önce otomatik olarak etkinleştirilir, çünkü otomatik işlemin etkinleştirilmesi (yani senkronizasyonun gerçekleşmesini bekler, bu da, takılan her satırdan sonra verilerin sabit disk gibi kalıcı depolama birimine yazılmasını bekler).

Otomatik işlem yanlışsa, eşitleme beklemez.

Senkronizasyonun beklemede beklemedeki ve beklemedeki fark, verilerin aslında sabit diske mi yoksa tamponda mı (IO'nun arabelleğe alınabileceğini veya sabit diskin arabelleğe alınabileceğinin) garantisidir.

Kısacası, otomatik işlemin devre dışı bırakılması size performans artışı sağlar. Ve varsayılan olarak otomatik işlemin etkinleştirildiğini düşünüyorum.

AÇIK taahhüt ve hala sadece toplu operasyondan önce işlem olarak başlar ve sonra hareketi tamamlamak için denemek performans artışı ihtiyaç otomatik olmasını istiyorsanız optimizasyonu bir başka yolu. Bu sayede sqlite her ekleme işleminden sonra otomatik işlem yapmaz ve iyi bir performans artışı sağlar.

DÜZENLEME:

Eğer sadece otomatik devre dışı bırakıyorsunuz bir işlemi başlamadan bu işlem için taahhüt ve işlem bittikten sonra bu 'açık' Tekrar olacak. Satırları ayrı ayrı eklediğinizde/güncelleştirdiğinizde (toplu olarak değil), otomatik işlemin hangi olduğuna karar verirseniz, her ekleme/güncelleştirme için açıkça bir işlemi başlatmanız gerekmez. Otomatik taahhüdün doğru olarak ayarlanması ile ilgili olarak, gerçeğinden sonra, taahhüt için çağrı yapmaz. Otomatik olarak 'u doğru yaparsanız ve zaten eklediğiniz/güncellediyseniz, herhangi bir efektiniz olmaz ve bu ekleme/güncellemeyi yapmadan önce otomatik olarak doğru garantileri olmaz.

Here's some information about speeding up Sqlite INSERTs.

+0

Detaylı cevap için teşekkür ederiz. Doğru, 'autoCommit()' varsayılan olarak etkindir. AutoCommit (true) 'çağrıldığında, toplu veri kalıcı depolamaya yazılacak mı? – c24w

+0

evet yazılacak. Otomatik taahhütte olduğu gibi aynı garantiye sahip olmayacaktır. Size başka bir seçenek vermek için ans'ı güncelledim. – havexz

3

@havexz cevap yüzden ben kuşaklar için bir cevap eklersiniz düşünseydim bazı yanlış bilgiler verir.

  1. FYI, SQLite otomatik olarak doğrudan işlemi desteklemez. Bir SQLite JDBC bağlantısında setAutoCommit(false)'u çağırmak aslında Xerial ve Zentus sürücüleri ile bir işlem başlatır. Bu SO soruya bakın: true irade değil için How to disable autocommit in sqlite4java?

  2. Ben ayarını geri otomatik taahhüt olduğunu neredeyse eminim bir veritabanı bağlantısı üzerinde taahhüt yapın. Tamamlanan bir sonraki ifade, bekleyen değişiklikleri devam ettirecektir, ancak toplu işlemleri gerçekten gerçekleştirmek için conn.commit(); yapmalısınız.

  3. Bir işlemin temel olarak başlatılması, otomatik işlemin kapatılmasıyla aynıdır, bu nedenle bir işlemin içindeyken otomatik işlemeyi açık bırakabileceğinizi ima etmek uygun değildir.

+0

Girdiğiniz için teşekkürler Bay Gray! Kodun [burada] (http://www.zentus.com/sqlitejdbc/) neden orijinal yazıma göre 'setAutoCommit (...)' kullanılmasını önerdiğini hala karıştırıyorum. Ayrıca, conn.exec ("COMMIT") 've' conn.commit() 'nasıl karşılaştırılır? İkincisi esas olarak eskiyi 'sarar mı? Teşekkürler! – c24w

+1

Belki Zentus sürücüsü kapakların altında bir işlem yapıyor. BTW, Xerial Sqlite sürücüsü, Zentus'a göre çok daha üstündür. http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC – Gray

+0

RE: 'conn.exec (" COMMIT ")', sağ, duh, bunu 'conn.commit()' olarak değiştirdim. – Gray

İlgili konular