您的位置:首页 > 大数据 > 人工智能

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

2015-12-29 15:30 471 查看
@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不同步的问题,这个问题要怎么解决啊?

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐