无状态会话bean中的高效JDBC连接管理

时间:2013-09-24 06:32:54

标签: java jdbc ejb

我有一个无状态会话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
    }

2 个答案:

答案 0 :(得分:5)

最佳解决方案是使用DataSource

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

public String runTheQuery(String sql) throws SQLException 
    Connection con = dataSource.getConnection();
    try {
       ...
    } finally {
        con.close();
    }
}

答案 1 :(得分:1)

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

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

否则它不常见,因此就像过早的性能优化一样。

数据源提供额外的功能:例如,在注入连接之前,如果它仍然有效,则检查连接。如果你自己做了,你将不得不重新实现它。并且该代码可能存在错误。