2010-11-18 12 views
1

Tekton dao sınıfındaki bağlantı nesnesinin bir üye değişkeni olduğu ve yarış koşullarına eğilimli olduğu eski bir kodla uğraşıyorum.Java'da iş parçacığı olmayan bir java.sql.Connection nesnesi kullanmanın olanakları neler olabilir?

Bunun potansiyel bir tasarım sorunu olduğunu biliyorum, ancak java'da jdbc bağlantı nesnesiyle uğraşırken düşünülebilecek farklı türde sorunları bilmek istiyorum.

package com.code.ref.dao; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 

import com.code.ref.utils.common.DBUtil; 
import com.code.ref.utils.common.PCMLLogger; 

public class EventLoggerDAO { 

private static EventLoggerDAO staticobj_EventLoggerDAO; 

private Connection obj_ClsConnection; 

private PreparedStatement obj_ClsPreparedStmt; 

private EventLoggerDAO() { 
    try { 
    obj_ClsConnection = DBUtil.getConnection(); 
    } catch (Exception e) { 
    PCMLLogger.logMessage(EventLoggerDAO.class, "EventLoggerDAO()", "Some problem in creating db connection:" + e); 
    } 
} 

public static synchronized EventLoggerDAO getInstance() { 
    if (staticobj_EventLoggerDAO == null) { 
    synchronized (EventLoggerDAO.class) { 
    if (staticobj_EventLoggerDAO == null) 
    staticobj_EventLoggerDAO = new EventLoggerDAO(); 
    } 
    } 
    return staticobj_EventLoggerDAO; 
} 

public void addEvent(String sName, String sType, String sAction, String sModifiedBy) throws Exception { 
    StringBuffer sbQuery = new StringBuffer(); 
    sbQuery.append("INSERT INTO TM_EVENT_LOG (NAME, TYPE, ACTION, MODIFIED_BY) ").append("VALUES (?, ?, ?, ?) "); 
    if(obj_ClsConnection == null) 
    obj_ClsConnection = DBUtil.getConnection(); 

    obj_ClsPreparedStmt = obj_ClsConnection.prepareStatement(sbQuery.toString()); 
    obj_ClsPreparedStmt.setString(1, sName); 
    obj_ClsPreparedStmt.setString(2, sType); 
    obj_ClsPreparedStmt.setString(3, sAction); 
    obj_ClsPreparedStmt.setString(4, sModifiedBy); 
    obj_ClsPreparedStmt.executeUpdate(); 
    if (obj_ClsPreparedStmt != null) { 
    obj_ClsPreparedStmt.close(); 
    obj_ClsPreparedStmt = null; 
    } 
    } 
} 

Sorun gözlenen:

Bazen tablo TM_EVENT_LOG durak ekleme sunucu günlüklerinde bile istisna olmadığını olur takiben

EventLoggerDAO sınıf kodudur.

Yarış koşullarında, farklı parçacıkların tuttuğu bağlantı nesnelerinin tutarsız duruma yol açabileceğinden ve bu verileri vermeyebileceğinden şüpheleniyorum. Bağlantı, bağlantı havuzunu koruyan bir web sunucusu veri kaynağı aracılığıyla türetilir.

Bunun neden olabileceğini düşündüğünüz herhangi bir düşünce veya fikir var mı?

+0

Kodu biçimlendirdiğiniz için teşekkürler Carl. Niyetle denedim ama boşuna. – Tushu

+0

Burada ırk koşullarıyla bariz ve çok ciddi problemleriniz var. Gözlemlediğiniz semptomlara nasıl sebep olup olmadığını anlamaya çalışmak yerine, bildiğiniz problemleri düzeltmenizi tavsiye ederim. (Occam'ın Jileti ve hepsi). –

+0

Uygulama sunucusu günlüklerini incelediğimde, yukarıdaki kod için "java.sql.SQLException: ORA-01000: maksimum açık imleçler aşıldı". En büyük düşüncelerimde bu nesnenin bağlantı havuzuna geri dönmeden bu bağlantıyı bekletmesini istemem olsa bile, bir sql ifadesini çalıştırdıktan sonra her seferinde bağlantıyı kapatmak zorunlu mudur? – Tushu

cevap

1

Her şey burada olabilir. Yerel bir değişken olarak kullanıldığında, obj_ClsPreparedStmt üye değişkeni olduğunu unutmayın - paylaşılan Connection'dan çok daha ciddi bir sorun gibi görünüyor.

+0

Yukarıdaki kodun ciddi bir sorun olduğunu anlıyorum ama bildiğim konu daha çok ilgimi çekiyor, bağlantı otomatik bağlantı durumundayken bile bu tablonun durması nasıl mümkün olabilir? – Tushu

+0

Bağlantı ile ilgili bile olmayabilir. Kodlara bakın - başka bir iş parçacığı üzerinde parametreleri ayarlayan bir iş parçacığı, 'obj_ClsPreparedStmt' üzerine yazabilir. – axtavt

+0

Kabul edildi, ancak bundan sonra hazırlananStatement nesnesinde bir executeUpdate() bulunmalıdır. Böylece, bozuk değerler olsa bile, bir sonraki uygulama sunucusunun yeniden başlatılıncaya kadar tamamen durdurulmuş olduğu görülen ekler olmalıdır. – Tushu