簡體   English   中英

EJB 3.0托管bean注入和數據庫連接關閉

[英]EJB 3.0 Managed bean injecting and db connection closing

在ejb 3.0 jboss 6環境中,我有一個稱為DBInterface的bean,該bean被注入許多dao類中以執行sql查詢。 DBInterface bean將數據源作為字段變量注入。 DBInterface Bean中的所有方法都從注入的數據源獲取數據庫連接,並在處理db-calls之后關閉該連接。 在運行應用程序時,一段時間后,我得到sql異常,說無法創建數據庫連接。 我正在finally塊中的每個方法調用上關閉連接。 我在哪里出錯? 我在jboss中使用ejb 3.0。 關於V

public class DBInterface {
   @Resource(mappedName = "java:ora.ds", type = DataSource.class)
    private static DataSource dataSource;
    protected Connection getConnection(){
        try {
        return dataSource.getConnection();
       } catch (SQLException e) {
        e.printstacktrace();
       }
    }
    public void method1() {
      Connection connection = null;
         try {
               connection = getConnection();
                ...............
                 db codes
                .................
         } catch (SQLException e) {
        logger.error(e);
        throw new DBException("sql exception ", e);
        } finally {
             try {
                    closeResources(rs, statement, connection);
             } catch (SQLException e) {
                  logger.error(e);
                    throw new DBException("sql exception ", e);
           }
       }
    }
    public void closeResources(ResultSet rs, Statement st, Connection con)
        throws SQLException {
           if (rs != null) {
             rs.close();
           }
          if (st != null) {
                 st.close();
           }
          if (con != null) {
           con.close();
         }

       }
}

您應該使用try-catch塊關閉所有資源。

if (rs != null) {
    rs.close();
}
if (st != null) {
    st.close();
}
if (con != null) {
    con.close();
}

應替換為:

if (rs != null) {
    try {
        rs.close();
    } catch (Exception exception) {
        logger.log("Failed to close ResultSet", exception);
    }
}
if (st != null) {
    try {
        st.close();
    } catch (Exception exception) {
        logger.log("Failed to close Statement", exception);
    }
}
if (con != null) {
    try {
        con.close();
    } catch (Exception exception) {
        logger.log("Failed to close Connection", exception);
    }
}

可以使用AbstractDAO類將其重構為更易於閱讀的內容:

public class DAOException extends RuntimeException {
    public DAOException(Throwable cause) {
        super(cause);
    }
}

public abstract class AbstractDAO {
    private static Logger logger = ...;
    private DataSource dataSource;

    protected void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException exception) {
            // There's nothing we can do
            throw new DAOException(exception);
        }
    }

    public void close(Connection connection) {
        try {
            connection.close();
        } catch (Exception exception) {
            // Log the exception
            logger.log("Failed to close Connection", exception);
        }
    }

    public void close(Statement statement) {
        try {
            statement.close();
        } catch (Exception exception) {
            // Log the exception
            logger.log("Failed to close Statement", exception);
        }
    }

    public void close(ResultSet resultSet) {
        try {
            resultSet.close();
        } catch (Exception exception) {
            // Log the exception
            logger.log("Failed to close ResultSet", exception);
        }
    }
}

public class MyDAO extends AbstractDAO {
    @Override
    @Resource("jdbc/myDS")
    protected void setDataSource(DataSource dataSource) {
        super.setDataSource(dataSource);
    }

    public void insert(MyObject myObject) {
        Connection connection = getConnection();
        try {
            PreparedStatement query = connection.createPreparedStatement("INSERT INTO MYOBJECT (ID, VALUE) VALUES (?, ?)");
            try {
                query.setLong(1, myObject.getID());
                query.setString(2, myObject.getValue());
                if (query.executeUpdate() != 1) {
                    throw new DAOException("ExecuteUpdate did not return expected result");
                }
            } finally {
                close(query);
            }
        } catch (SQLException exception) {
            // There's nothing we can do
            throw new DAOException(exception);
        } finally {
            close(connection);
        }
    }
}

我想知道的是,為什么不使用JPA? 我會考慮僅將JDBC用於無法從緩存中受益的對性能至關重要的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM