hibernate一进程修改数据,一进程查询数据,查询到的数据为什么不根据修改的数据变化?

一个进程使用while循环不断查询数据库,另一个应用程序更新了数据库中的某个字段,但是查询的部分并没有查询到数据库中的变化,使用数据库查询工具,可以看到数据确实已经更新,请问这是什么问题?

 

以下是查询部分的代码,该部分在一个线程中运行

 

 

while(true) {
                TasksDAO dao = new TasksDAO();
                
                Tasks task = dao.findById(id);
                System.out.println("task : " + task.getTaskId() + "task.getStatus " + task.getStatus());
                if (task.getStatus() == ServerConstants.TASK_COMPLETED) {
                    //任务执行结束
                    System.out.println("--------------------------");
                    synchronized (ws) {
                        
                        ws.notifyAll();
                    }
                    break;
                }
                try {
                    System.err.println("Not got it!! " + task.getStatus());
                    TimeUnit.SECONDS.sleep(10);

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        
                dao.getSession().close();
            }

 另外一个进程只是简单的更新了一个task的字段

 

private void changeTaskStatus(int taskID, String status) {
        TasksDAO dao = new TasksDAO();
        Tasks task = dao.findById(taskID);
        int iStatus = -1;
        if (status.equals(ServerConstants.TASK_STARTED_S)) {
            iStatus = ServerConstants.TASK_STARTED;
        } else if (status.equals(ServerConstants.TASK_RUNNING_S)) {
            iStatus = ServerConstants.TASK_RUNNING;
        } else if (status.equals(ServerConstants.TASK_COMPLETED_S)) {
            iStatus = ServerConstants.TASK_COMPLETED;
        }
        
        task.setStatus(iStatus);
        Transaction tran = dao.getSession().beginTransaction();
        dao.save(task);
        tran.commit();
        dao.getSession().close();
    }

 

谢谢,希望哪位仁兄能够帮忙解答!


问题补充:
问题,已经解决,采用了 lovewhzlq 的答案,解决方法是在查询的时候也加上事务处理,也就是beginTransaction和commit
代码如下

TasksDAO dao = new TasksDAO();
Transaction tran = dao.getSession().beginTransaction();
Tasks task = dao.findById(id);
tran.commit();
dao.getSession().close();


谢谢各位!!

这个和事务策略有关,

一个事务看不到另外一个事务更新的数据,

在[code="java"]dao.getSession().close(); [/code]之前加上
[code="java"]dao.getSession().flush();[/code]

[b]一个进程[/b]与[b]另一个应用程序[/b]
我认为这个是关键,查询进程里面不知道数据库是不是有被别的进程修改过。
按照默认的设置,它会先去自己进程的缓存中看看有没有数据,有数据,就先用自己的数据。如果是自己进程的程序要做增、删、改,它会清空自己的缓存。
但是现在时别的进程去做的修改,这个修改进程不会去通知查询进程去更新缓存,于是查询进程每次都只会傻傻的去看自己的缓存。

你可以按照
[quote="laitaogood"]在
[code="java"]1. dao.getSession().close();[/code]
之前加上
[code="java"]1. dao.getSession().flush();[/code]
[/quote]
去处理,每次强制要求hibernate去更新缓存,直接查数据库。

朋友,问题要自动关闭啦,结分哦