Çö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?
"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
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. –
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