2016-02-29 44 views
0

我想知道当我在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 
    } 
} 

回答

2

我建议你close你的资源,只要你能,这样的连接将被返回到池中更快。您也可以使用try-with-resources Statement来确保发生。

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

谢谢艾略特。但是,我的问题是我应该在代码中明确写入“session.close()”吗? – Syed

+0

如果你不使用'try-with-resources',那么**是**你应该明确地*在'finally''块中写'session,close()'。 –

+0

感谢您的更新。但究竟是什么使差异? – Syed

0

正如艾略特说,它能够更好地手动关闭会话不依靠任何东西,或者你可以使用上面,如果你使用的是Java 7或者以上规定的try块。

0

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

但这里有几个公设一下:

  1. 从试-与资源语句抛出的任何异常都 抑制。
  2. 您可以使用catch,最终像正常 一样阻止try-catch。
  3. 可以声明通过分号在try-与资源内部分隔的多个资源,如
try (
     java.util.zip.ZipFile zf = 
      new java.util.zip.ZipFile(zipFileName); 
     java.io.BufferedWriter writer = 
      java.nio.file.Files.newBufferedWriter(outputFilePath, charset) 
    ) 
  • 它的结束后关闭的资源先尝试阻止,即如果有任何异常来自尝试阻止或不阻止。之后它执行捕捉,最后阻止。
  • 在try-with-resource语句中声明的资源必须实现AutoCloseable或Closeable接口。