@Component public class LookCacheData { public static LookRecordService lookRecordServiceNo; public static PhoneBookService phoneBookServiceNo; public static UserService userServiceNo; public ThreadLook threadLook = new ThreadLook(); //所有登录用户 public static LinkedHashMap<String, CopyOnWriteArrayList<LookObject>> loginUserMap = new LinkedHashMap<>(); public LookCacheData() { threadLook.start(); System.out.println("~~~~~~~~~~~~~~~~LookCacheData~~~~~~~~~启动线程~~~~~~~~~"); } static class ThreadLook extends Thread { // 线程主处理函数,用于定期从数据库中读取Pk对放入队列中 @Transactional public void run() { while (true){ while (loginUserMap != null && loginUserMap.size() > 0) { for (String loginUid : loginUserMap.keySet()) { CopyOnWriteArrayList<LookObject> lookedList = (CopyOnWriteArrayList<LookObject>) loginUserMap.get(loginUid); if (StringUtils.isBlank(loginUid)) { continue; } User loginUser = userServiceNo.findByUid(loginUid);//该行进行查询 。。。。。。
每次通过controller进行的查询,是完全正常的,可是该线程中的查询,总是出现以下错误提示:
Exception in thread "Thread-14" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:993) at com.haokan.tools.base.BaseDao.getSession(BaseDao.java:61) at com.haokan.tools.base.BaseDao.queryByUniqueColumn(BaseDao.java:794) at com.haokan.modules.service.UserService.findByUid(UserService.java:74) at com.haokan.tools.bean.LookCacheData$ThreadLook.run(LookCacheData.java:55)
hibernate的配置如下:
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
网上都说,将HibernateSession绑定到Thread,只需要将current_session_context_class配置好就好了,可是,我这始终会出现异常:不能获取当前线程的同步session;
无论是在LookCacheData中还是在ThreadLook中添加以下绑定注解,service对象都是null,
@Autowired public LookRecordService lookRecordService; @Autowired public PhoneBookService phoneBookService; @Autowired public UserService userService;
所以,上面的
User loginUser = userServiceNo.findByUid(loginUid);
中的userServiceNo是我在用户登录的时候的userService的值,如果能够让上面3个绑定注解在我的线程运行中的时候不是null,就万事大吉了,可是他们3个一直为空;如果用其他controller中的userService的值,又会出现session不同步的问题,这个问题要怎么解决啊?