public List<Entity> fetchEntities(Date fromDate, Date toDate) {
Criteria criteria = getSession().createCriteria(Entity.class);
criteria.add(Restrictions.between("cts", fromDate, toDate));
criteria.addOrder(Order.desc("cts"));
return (List<Entity>) criteria.list();
}
Need I close session or not? How correctly do it?
If you create a session instance and close it for each executed query, it may work but it may also have side effects such as a connection pool bottleneck or a overuse of memory.
close()
releases the JDBC connection and performs some cleaning.
The Connection close()
method of the org.hibernate.Interface Session class states :
End the session by releasing the JDBC connection and cleaning up.
So you should not open and close the session for each executed query.
You should rather close the connection when all queries associated to a client request/processing (user, batch ...) were executed.
Of course if the client request consists of a single query, it makes sense to close it after the query execution.
Actually you use SessionFactory.openSession()
that creates a new session that is not bound to the Hibernate persistence context.
It means that you have to explicitly close the session as you finish working with it otherwise it will never be closed.
Supposing that the method is the single one executed in the client request, you could write something like :
public List<Entity> fetchEntities(Date fromDate, Date toDate) {
Session session;
try{
session = getSession();
Criteria criteria = session.createCriteria(Entity.class);
criteria.add(Restrictions.between("cts", fromDate, toDate));
criteria.addOrder(Order.desc("cts"));
return (List<Entity>) criteria.list();
}
finally {
if (session != null) {
session.close();
}
}
Note that if you used SessionFactory.getCurrentSession()
, you would not need to close it explicitly as it obtains the current session from the persistence context that creates the session as the transaction is started and close it as the transaction is finished.