2013-09-24 47 views
0

我有一个无状态会话bean,它的一个方法被重复用于在纯JDBC连接中运行SQL查询。为避免频繁地打开和关闭连接,我提出了以下方法,并想知道这是否是一种好的做法:无状态会话bean中的高效JDBC连接管理

我在注释@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 
    } 

回答

5

最好的解决方案是使用数据源

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

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

这不会避免每次调用runTheQuery()方法时打开一个连接 - 在这种情况下,该方法意味着在控制器类的循环中重复调用100000次。 – fledglingCoder

+2

DataSources通常是连接池,它们重新使用连接,con.close只是将其返回到池。 –

1

数据源通常总是有打开的连接的数目,因此在大多数情况下不会有真正的开销正从一个数据源的连接。

所以这只是一个有效的做法,如果你之前测过,那它真的是解决了现有的性能问题

否则它的不常见,因此它就像过早的性能优化。数据源提供了额外的功能:例如,在注入之前检查连接是否仍然有效。如果你自己做了,你将不得不重新实现它。该代码中可能存在错误。