在使用连接池时关闭连接的位置?

时间:2014-01-31 08:52:17

标签: java database connection-pooling psql vaadin7

我正在使用Vaadin框架并遵循MVC设计模式来开发Web应用程序项目。 在为我的项目实现连接池功能时,我遇到了以下问题。 我在一个类(数据类)中获取ResultSet,我在另一个类(业务逻辑)中使用该ResultSet。 在业务逻辑类中使用ResultSet之后,我必须关闭连接对象。 在不将连接对象传递给业务逻辑类的情况下,实现此目的的有效方法是什么? 请解释一下。谢谢。

1 个答案:

答案 0 :(得分:1)

我建议你写一个Dao,它返回一个Business Objects列表而不是结果集。连接必须在Dao本身关闭。以下是一个例子

public class PersonDao {
    private DataSource ds; //add a setter and inject the JDBC resource
    public List<Person> getPersons() {
        List<Person> personList = new ArrayList();
        Connection con;
        PreparedStatement pstmt;
        try {
            con = ds.getConnection(username, password);
            pstmt = con.prepareStatement("SELECT * FROM PERSON");
            ResultSet rs = pstmt.executeQuery(query); 
            //Fetch the resultset, iterate over it and populate the list
            while (rs.next()) {
                Person p = new Person();
                p.setName(rs.getString("name");
                personList.add(p);
            }
        } catch (Exception ex {
            // ... code to handle exceptions
       } finally {
            if (con != null) con.close();
       }

      return personList;
}

如果您可以使用Java 7,您还可以使用try with resource来自动处理关闭连接。如果您无法更改Dao界面,那么在Dao和业务层之间编写一个层是个好主意。