[英]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.