java多线程使用HibernateSession 时报 No session 的解决办法(转)

服务端新开多线程使用HibernateSession 杜绝No session

新起的线程需要绑定Hibernate session,才能在新线程中使用事务和延迟加载等功能,否则会曝出no session异常;

解决办法:

[java] view plaincopy

  1. new Runnable() {
  2. @Override
  3. public void run() {
  4. //                  ----------绑定session到当前线程------------
  5. SessionFactory sessionFactory = (SessionFactory)applicationContext.getBean("sessionFactory");
  6. boolean participate = ConcurrentUtil.bindHibernateSessionToThread(sessionFactory);
  7. //                  ---------你的业务---------------
  8. <pre name="code" class="java">//                  ----------关闭session------------
  9. ConcurrentUtil.closeHibernateSessionFromThread(participate, sessionFactory);
  10. }
  11. }

bindHibernateSessionToThread方法:

[java] view plaincopy

  1. public static boolean bindHibernateSessionToThread(SessionFactory sessionFactory) {
  2. if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
  3. // Do not modify the Session: just set the participate flag.
  4. return true;
  5. } else {
  6. Session session = sessionFactory.openSession();
  7. session.setFlushMode(FlushMode.MANUAL);
  8. SessionHolder sessionHolder = new SessionHolder(session);
  9. TransactionSynchronizationManager.bindResource(sessionFactory, sessionHolder);
  10. }
  11. return false;
  12. }

closeHibernateSessionFromThread方法

[java] view plaincopy

  1. public static void closeHibernateSessionFromThread(boolean participate, Object sessionFactory) {
  2. if (!participate) {
  3. SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.unbindResource(sessionFactory);
  4. SessionFactoryUtils.closeSession(sessionHolder.getSession());
  5. }
  6. }

事务边界则由aop或者Transactional标记来控制,示例代码只是保证具备事务性的方法在需要的时候能从当前线程中获得session对象。

上述代码大部分截取自Spring的OpenSessionInViewFilter。

时间: 2024-09-29 17:49:13

java多线程使用HibernateSession 时报 No session 的解决办法(转)的相关文章

服务端新开多线程使用HibernateSession 杜绝No session

新起的线程需要绑定Hibernate session,才能在新线程中使用事务和延迟加载等功能,否则会曝出no session异常: 解决办法: new Runnable() { @Override public void run() { // ----------绑定session到当前线程------------ SessionFactory sessionFactory = (SessionFactory)applicationContext.getBean("sessionFactory&

java多线程的等待唤醒机制及如何解决同步过程中的安全问题

/* class Person{ String name; String sex; boolean flag = true; public void setPerson(String name, String sex){ this.sex=sex; this.name=name; } } class Input implements Runnable{ int x=0; Person p; Input(Person p){ this.p=p; } public void run(){ while

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session异常解决办法

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session异常解决办法 为什么还会说已经存在相同的session了呢.然后每次将项目重启后第一次编辑的时候问题不会触发,只有当第二次操作的时候才会出现这个问题. 解决办法:关闭session.好好检查操作完成后有没有关闭会话. org.hibernat

Java Runtime.getRuntime().exec 执行带空格命令解决办法

String command = OpenOffice_HOME + "program\\soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard "; command = "cmd /c start "+command.replaceAll(" ","\" \""); P

遇到java.lang.IllegalThreadStateException: Thread already started. 错误的解决办法

通过单击事件开启线程时,再次单击就会出现 java.lang.IllegalThreadStateException: Thread already started. 错误 解决办法: 创建一个Runnable: Runnable DownloadRunnable = new Runnable() { @Override public void run() { //需要处理操作} 然后每次需要调用的时候会重新new一个Thread: new Thread(DownloadRunnable).st

Android开发中java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPointerException 错误的集中原因及解决办法

上面那个问题刚解决,就又来一个问题~~~~ 错误信息字符串:java.lang.RuntimeException: Unable to start activity ComponentInfo{...}: java.lang.NullPointerException 网上有不少解决办法 一般都会在Activity  onCreate()方法里的setContentView(XXX)发生此错误,网上查阅了很多原因,大概有四种重要可能的原因: 原因一:xxx的错误,若为R.layout.main 

转-java编译时error: illegal character &#39;\ufeff&#39; 的解决办法-https://blog.csdn.net/t518vs20s/article/details/80833061

原文链接:https://blog.csdn.net/shixing_11/article/details/6976900 最近开发人员通过SVN提交了xxx.java文件,因发布时该包有问题需要回退,故SCM将该xxx.java文件用editplus打开删除了新添的一行,删除后重新编译打包,却报了如下异常: java:[1,0] illegal character: \65279 表面看着该文件确实没错,看不出来问题,后来从SVN上更新下代码以后,发现本地也不报错,后来通过Eclipse查看了

Java多线程:生产者消费者更佳的解决方法(确定不会出现死锁)

今天看了一片博文,讲Java多线程之线程的协作,其中作者用程序实例说明了生产者和消费者问题,但我及其他读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的例子也都存在bug,经过仔细研究发现其中的问题,并解决了,感觉有意义贴出来分享下. 下面首先贴出的是有bug的代码,一个4个类,Plate.java: package CreatorAndConsumer; import java.util.ArrayList; import java.util.List; /** * 盘子,表示共享的资源

java.lang.IllegalStateException异常产生的原因及解决办法

错误原因:该异常表示,当前对客户端的响应已经结束,不能在响应已经结束(或说消亡)后再向客户端(实际上是缓冲区)输出任何内容. 具体分析: 首先解释下flush(),我们知道在使用读写流的时候数据先被读入内存这个缓冲区中, 然后再写入文件,但是当数据读完时不代表数据已经写入文件完毕,因为可能还有一部分仍未写入文件而留在内存中,这时调用flush()方法就会把缓冲区的数据强行清空输出,因此flush()的作用就是保证缓存清空输出.response是服务端对客户端请求的一个响应,其中封装了响应头.状态