0

我有一个无状态会话 bean,该方法重复用于在普通 JDBC 连接中运行 SQL 查询。为了避免过于频繁地打开和关闭连接,我想出了以下方法,并想知道这是否是一个好习惯:

我在注解为@PostConstruct 的方法中打开连接一次,然后在另一种注解为@PreDestroy 的方法中关闭连接

该代码运行良好,没有明显的内存泄漏或我知道的任何问题 - 只是想知道更有经验的开发人员是否会同意这是否是一种好习惯。

@PostConstruct
public void initBean() {
   try {
      conn = Connector.getConnection();
   } catch (Exception e) {
      // Handle errors for Class.forName
      e.printStackTrace();
   }
}

public String runTheQuery(String sql) {
   String result ="";
   try {
      pstmt = conn.prepareStatement(sql);
      rs = pstmt.executeQuery();
      result = rs.getString(1);
      rs.close();
      pstmt.close();
   } catch (SQLException se) {
      // Handle errors for JDBC
   }
   return result;
}

@PreDestroy
public void endingTitles() {
   System.out.println("Closing the JDBC connection...");
   try {
      rs.close();
      conn.close();
      pstmt.close();
   } catch (SQLException se) {
      // Handle errors for JDBC
      se.printStackTrace();
   } catch (Exception e) {
      e.printStackTrace();
} finally {
            // finally block used to close resources
            try {
                if (pstmt != null)
                    pstmt.close();
            } catch (SQLException se2) {
            }// nothing we can do
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }// end finally try
        }// end try
    }
4

2 回答 2

5

最好的解决方案是使用 DataSource

@Resource(mappedName="java:/DefaultDS")
DataSource dataSource;

public String runTheQuery(String sql) throws SQLException 
    Connection con = dataSource.getConnection();
    try {
       ...
    } finally {
        con.close();
    }
}
于 2013-09-24T07:00:41.247 回答
1

数据源通常始终具有最小数量的打开连接,因此在大多数情况下,从数据源获取连接不会产生真正的开销。

所以这只是一种有效的做法,如果你之前已经测量过,它确实解决了现有的性能问题

否则它不常见,因此它类似于过早的性能优化。

数据源提供附加功能:例如,在连接被注入之前检查连接是否仍然有效。如果你自己做了,你将不得不重新实现它。该代码中可能存在错误。

于 2013-09-24T08:00:27.230 回答