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ı?
Kodu biçimlendirdiğiniz için teşekkürler Carl. Niyetle denedim ama boşuna. – Tushu
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). –
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