Каковы могут быть возможности использования небезопасного объекта java.sql.Connection в java? - PullRequest
1 голос
/ 18 ноября 2010

Я имею дело с унаследованным кодом, в котором объект соединения в классе singleton dao является переменной-членом и подвержен гоночным условиям.

Я знаю, что это потенциальная проблема проектирования, однако мне интересно узнать о различных типах проблем, которые могут возникнуть при работе с объектом соединения jdbc в java.

Ниже приведен код класса EventLoggerDAO:

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;
   }
  }
 }

Проблема наблюдалась :

Иногда случается, что таблица TM_EVENT_LOG перестает вставлять, и в журналах сервера нет даже исключений.

Я подозреваю, что в условиях состязания объекты соединения, содержащиеся в разных потоках, могут приводить к несогласованному состоянию, а также могут не передавать данные. Соединение получается через источник данных websphere, поддерживающий пул соединений.

Есть какие-нибудь мысли или идеи, почему это может происходить?

1 Ответ

1 голос
/ 18 ноября 2010

Здесь все может случиться. Обратите внимание, что obj_ClsPreparedStmt является переменной-членом, в то время как она используется как локальная переменная - кажется, это гораздо более серьезная проблема, чем общая Connection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...