怎么解决啊???"Thread-14" HibernateException: Could not obtain transaction-.....

@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不同步的问题,这个问题要怎么解决啊?

猜你喜欢

转载自yunlian0621.iteye.com/blog/2267428