当我们使用c3p0连接池时,会在休眠时关闭会话吗?

时间:2016-02-29 06:04:45

标签: java hibernate session c3p0

我想知道在hibernate中使用c3p0连接池时是否应该使用session.close()?或c3p0在一定时间间隔后自动关闭?我是否需要通过

打开会话
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session=factory.openSession();  

因为在以下教程中它不会关闭会话。

http://examples.javacodegeeks.com/enterprise-java/hibernate/hibernate-connection-pool-configuration-with-c3p0-example/

正确的方法是什么?

编辑:

这将是我的代码

@SuppressWarnings("unchecked")
@Override
public JSONObject  getUserDetails(int id) {
    long lStartTime = new Date().getTime(); 
    JSONObject obj = new JSONObject();
    try(Session session=factory.openSession()) {
        Employee emp=(Employee)session.load(Employee.class,id);     

        if(emp != null) {
            obj.put("id", emp.getId());
            obj.put("name", emp.getName());
        }                  
        long lEndTime = new Date().getTime();
        log.info("[ Personal Details ]Time elapsed For Fetching :"+(lEndTime - lStartTime));

    } catch (Exception e) {
        // TODO: handle exception
    }
}

3 个答案:

答案 0 :(得分:3)

我建议你尽快close你的资源,这样连接就会更快地返回到池 。您也可以使用try-with-resources Statement来确保发生这种情况。

SessionFactory factory = HibernateUtil.getSessionFactory();
try (Session session = factory.openSession()) {
    // ...
}

答案 1 :(得分:0)

正如ELLIOT所说的那样,不使用任何东西就可以手动关闭会话,或者如果你使用的是java 7或更高版本,你可以使用上面指定的try块。

答案 2 :(得分:0)

是使用try-with-resources是更好的选择。

但是这里有很少的假设:

  1. 从try-with-resources语句抛出的任何异常都是 抑制。
  2. 你可以使用catch,最后像普通一样阻止 试着抓。
  3. 您可以在try-with-resources(例如
  4. )中声明由分号分隔的多个资源
    try (
            java.util.zip.ZipFile zf =
                 new java.util.zip.ZipFile(zipFileName);
            java.io.BufferedWriter writer = 
                java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
        )
    
    1. 首先在try块结束后关闭资源,即如果有任何异常来自try块。之后它执行catch,最后阻止。
    2. 您在try-with-resource语句中声明的资源必须实现AutoCloseable或Closeable Interface。