2010-06-02 22 views
5

Çözmek istediğim temel sorun, oluşturulduktan sonra sonuçları Java'dan almak için yeterince uzun süre kalması gereken MySQL'de birkaç geçici tablo oluşturan bir görev çalıştırıyor. İlgili verilerin büyüklüğü nedeniyle, görev grup halinde tamamlanmalıdır. Her parti, JDBC ile çağrılan bir saklı prosedüre çağrıdır. Tüm süreç, büyük bir veri seti için yarım saat veya daha uzun sürebilir.Yay ve Hazırda Bekletme ile uzun süren işlemleriniz var mı?

Geçici tablolara erişim sağlamak için, TransactionCallbackWithoutResult ile tek bir Spring işleminde, tüm görevi baştan sona bitirmeye başladım. Aksi takdirde, geçici tablolara erişimi olmayan farklı bir bağlantı kurabilirim (bu, her şeyi bir işlemde sarmadan önce olur).

Bu, geliştirme ortamımda iyi çalıştı. Farklı görev benim uzun koşu işlemin yürütülmesi sırasında aynı tabloların bazı erişmeye çalıştığımızda bu oldu

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 

: Ancak, üretimde aşağıdaki özel durum var. Kafamı karıştıran şey, uzun süren işlemin yalnızca geçici tablolara eklenmesi veya güncellenmesidir. Geçici olmayan tablolara tüm erişim sadece seçer. Hangi belgeleri bulabildiğimden, varsayılan Spring işlem yalıtım düzeyi, bu durumda MySQL'in engellenmesine neden olmamalıdır.

İlk sorum, bu doğru yaklaşım mı? Uzun süren bir işlem olmadan bir hazırda bekletme şablonunda tekrar tekrar aynı bağlantıyı almamı sağlayabilir miyim?

Uzun süren işlem yaklaşımı doğruysa, yalıtım düzeyleri açısından neyi kontrol etmeliyim? Anlayışım, İlkbahar/MySQL işlemlerinde varsayılan yalıtım düzeyinin yalnızca seçimler yoluyla erişilen tabloları kilitlememesi gerektiğini doğru mu? Hangi tabloların çakışmaya neden olduğunu ve bu tabloların işlem tarafından kilitlenmesini önlemek için ne yapabilirim?

cevap

1

Tablonuz geçici olduğunu söylediğinizde, işlem kapsamı mı? Bu, diğer işlemleri (belki farklı bir işlemde) görememek/erişememeye yol açabilir. Belki de gerçek bir tablo ve geçici bir tablo içeren bir katılım, gerçek tabloyu bir şekilde kilitler.

Kök nedeni: Bağlantıyı kilitleyen nedir belirlemek için MySQL araçlarını kullanmayı denediniz mi? Sıradaki satır kilitleme gibi bir şey olabilir. MySQL araçlarını çok iyi bilmiyorum, ama oracle'de hangi bağlantıların diğer bağlantıları engellediğini görebilirsiniz.

İşlem zaman aşımı: Çok daha uzun bir zaman aşımıyla ikinci bir bağlantı havuzu/veri kaynağı oluşturmalısınız. Uzun süren göreviniz için bu bağlantı havuzunu kullanın. Üretim ortamınızın sıkışmış bağlantıları tespit ederek size yardımcı olmaya çalıştığını düşünüyorum.

6

İşlemi uzun süre kötülük için açık tutmayı düşünüyorum. Kariyerim sırasında "genişletilmiş" tanımı saniyelerden milisaniye indi.

Tekrarlanamaz problemler ve kafa çizme problemleri için bitmeyen bir kaynaktır. Bu durumda mermiyi ısırır ve yazılımda bir "iş günlüğü" bulundururum ve eğer parti başarısız olursa temizlemek için tersine yeniden oynatabilirsiniz.

+0

"Bağlantıyı sürdür" sorununa bir çözüm var mı? Benim durumumda, Spring ve Hibernate, veritabanına olan bağlantımı yürütüyor ve her seferinde tek bir işlemde sarılmaya başvurmadan aynı bağlantıyı almada sorun yaşadım. Aynı bağlantıyı sürdürmeden, geçici tablolara erişimi kaybederim. – jimbokun

+0

Bir iş dosyasında bir kimlik ve toplu iş işleminde ulaşılan kilometre taşları varsa, TEMP_ _STUFF gibi düzenli tablolar oluşturabilirsiniz. Ulaşılan kilometre taşını temel alarak ilerlemeyi kaldırabilir ve iptal edilen toplu işlemlere devam edebilirsiniz. İşleme bir (yani, bir kilometre taşı DONE) sonra, tabloları kaldırmak ve log "CLEANED" kilometre taşı ulaştınız. Tüm işlemler artık ince taneli işlemler ile yapılabilir. Bu yaklaşımda sakıncalı, toplu iş başlatıldığında DB'nin durumunun "anlık görüntüsünü" görmemenizdir. Bu bir sorun olabilir veya olmayabilir. –

+0

Bu çok iyi bir tavsiye. Bununla birlikte, bir sorunum var. İlk işlemenin bir kısmı, her grupta erişilen geçici tabloları oluşturur. Bu ilk işlem, her parti için tekrarlanması gerekiyorsa, önemli bir performans isabeti olacak kadar önemli bir zaman alır. Bu ilk işlemin nasıl gerçekleştirileceğinden emin değilim, ancak biraz daha düşüneceğim. – jimbokun

0

Justin, Transaction zaman aşımı ile ilgili olarak bahsettiğim gibi, son zamanlarda bağlantı havuzunun (benim durumumda Tomcat 7'de tomcat dbcp), uzun çalışma bağlantılarını işaretlemeyi işaretlemesi gereken ayarlamayı yapmasıyla sorunu çözdüm ve sonra kapatın . Bu parametreleri değiştirdikten sonra bu sorunu önleyebilirim.

İlgili konular