Java programımdan çağrılması gereken bir oracle stored proc
sahibim. Parametreleri saklanan proba iletmek için CallableStatement
kullanmıştım. Ben oracle ince sürücü kullanıyorum (ilgili jndi girdisine karşı web mantık sunucusunda yapılandırılmış). Bu saklanan proc herhangi bir OUT değeri yok. Bu saklanan proc sayısal bir değeri kabul eder ve alınan değer temelinde db'de birçok güncelleme yapar.HazırlandıStatement, CallableStatement and Performance Considerations
Bir bağlantı nesnesi alıyorum ve sonra bu kaydedilmiş proc döngüsüne (20 sayıyı geçmek için 20 kez) arayın. Bu depolanmış probu doğrudan bir oracle istemcisinden çağırdığımda, yürütme 2-3 saniyede tamamlanır. Ancak davranış benim java kodumdan tahmin edilemez. Bazı çağrıların tamamlanması 30-40 saniye sürüyor.
CallableStatement
yerine PreparedStatement
kullanmayı denedim ve marjinal performans iyileştirmesini (davranış hala tutarsız olsa da) görebiliyordum.
- benim dava
PreparedStatement
yerineCallableStatement
storedproc herhangi OUT parametreleri yok verilen kullanmak için sorun olur mu? PreparedStatement
'unCallableStatement
üzerinde bir performans artışıyla karşılaşmasının bir nedeni var mı, yoksa hatalı bir şekilde gözlemlediğim bir şey mi?- Bu performans sorununu çözmek için daha iyi bir yaklaşım var mı?
Kod gönderebilir misiniz? Alternatif olarak, her yinelemeyle bağlantınızın kurulmadığını doğrulayın (tek bir bağlantıyı tekrar tekrar kullanmak yerine) ve her bir yinelemeyle 'conn.prepareCall()' aramayacağınızı onaylayın (yalnızca '.setInt yerine döngü içinde) 've' .execute(). – Matt
Saklı yordamınızı birden çok kez çağırıyorsunuz, değil mi? Toplu iş aramalarını denediniz mi? http://docs.oracle.com/javase/1.3/docs/guide/jdbc/getstart/callablestatement.html bkz. 7.1.3 –
20 arama yapmak yerine, neden anonim olmayan bir PL/SQL bloğu denemiyorsunuz? çağrı proc ... çağrı proc ...... end;) saklanan procunuzu 20 kez çağırır ve veritabanına anonim bir blok ile bir çağrı yapar. – GriffeyDog