Hibernate-3.6.8:session-per-request

  session-per-request:为每次请求一个 session当有请求到达这个 servlet 的时候,通过对 SessionFactory 的第一次调用,打开一个新的 Hibernate Session。然后启动一个数据库事务 — 所有的数据访问都是在事务中进行,不管是读还是写(我们在应用程序中不使用 auto-commit 模式)。

  不要为每次数据库操作都使用一个新的 Hibernate Session。将 Hibernate Session 的范围设置为整个请求。要用 getCurrentSession(),这样它自动会绑定到当前 Java 线程。

  下一步,对请求的可能动作进行处理,渲染出反馈的 HTML。

  最后,当处理与渲染都结束的时候,这个工作单元就结束了。假若在处理或渲染的时候有任何错误发生,会抛出一个异常,回滚数据库事务。这样,session-per-request 模式就完成了。为了避免在每个 servlet 中都编写事务边界界定的代码,可以考虑写一个 servlet 过滤器(filter)来更好地解决。关于这一模式的更多信息,请参阅 Hibernate 网站和 Wiki,这一模式叫做 Open Session in View — 只要你考虑用JSP来渲染你的视图(view),而不是在servlet中,你就会很快用到它。

 1 public class EventManagerServlet extends HttpServlet {
2
3 protected void doGet(
4 HttpServletRequest request,
5 HttpServletResponse response) throws ServletException, IOException {
6
7 SimpleDateFormat dateFormatter = new SimpleDateFormat( "dd.MM.yyyy" );
8
9 try {
10 // Begin unit of work
11 HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
12
13 // Process request and render page...
14
15 // End unit of work
16 HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();
17 }
18 catch (Exception ex) {
19 HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
20 if ( ServletException.class.isInstance( ex ) ) {
21 throw ( ServletException ) ex;
22 }
23 else {
24 throw new ServletException( ex );
25 }
26 }
27 }
28
29 }

 

posted @ 2012-03-05 16:16  我愿为蛹  阅读(482)  评论(0)    收藏  举报