由于在多线程应用程序(1st clue,2nd clue,3rd clue等)中尝试使用Hibernate时遇到的所有问题,我想到了另一个解决方案:在经典 Controller
中实现逻辑部分,并使用URL.openConnection()
从我的线程中调用它。
换句话说,而不是做这样的事情:
MyThread.java
public class MyThread implements Runnable {
@Override
public void run() {
// do some great stuff with Hibernate
}
}
Anywhere.java
new Thread(new MyThread()).start();
我想尝试类似的东西:
MyController.java
@Controller
public class MyController {
@RequestMapping(value = "myUrl", method = RequestMethod.GET)
public void myMethod() {
// do some great stuff with Hibernate
}
}
MyThread.java
public class MyThread implements Runnable {
@Override
public void run() {
// simple call the above mapped url
}
}
Anywhere.java
new Thread(new MyThread()).start();
你怎么看?是好是坏?我还没有尝试过,但我认为这样的解决方案可以防止我们在多线程中使用Hibernate遇到的常见错误,因为服务器将执行逻辑部分,就像有人请求假页面一样。
PS:我知道有一些解决方案在多线程应用程序中使用Hibernate,但每次我尝试一个,另一个出现,直到我厌倦了 - with-it 不归路。PS2:我知道需要保护这样的解决方案(例如UID作为令牌)。
答案 0 :(得分:4)
我真的没有看到你在这里尝试解决的问题。 Hibernate几乎总是在多线程环境中使用。例如,在webapps中,并发请求由多个并发线程处理,每个线程使用自己的Hibernate会话。这不会导致任何问题。
如果您在线程之间共享相同的会话,或者您在线程之间共享给定的实体,则会遇到问题。
如果你开始自己的线程,并且这个线程使用自己的会话和实体,我不明白为什么你会遇到任何问题。