一个进程使用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(); }
谢谢,希望哪位仁兄能够帮忙解答!
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去更新缓存,直接查数据库。
朋友,问题要自动关闭啦,结分哦