0

当您不确定是否已创建记录时,如何在多线程应用程序中使用 Hibernate。

Thread 1
Create Session
Do some Stuff
Create DatabaseObject
Do some more stuff
Close Session

Thread 1
Create Session
Do some Stuff
Create DatabaseObject
Do some more stuff
Commit Session

我的问题是 Thread1 可能会进行许多休眠调用,同时 Thread2 可能会尝试更新/创建相同的对象。我以为我可以通过捕获 StaleObjectException 来捕获并处理它,但问题是在我提交事务之前不会发生异常。这直到方法结束才会发生,因此很难处理可能在一个地方发生的所有情况。

或者,我可以在一个线程中使用多个会话,但现有会话运行时间不长,而且我确信闯入多个会话是一种 Hibernate 反模式。或者我可以添加一些可能导致的锁轮代码,但我认为我将不得不再次闯入多个会话

这样做的正常方法是什么?

举一个更具体的例子,Thread1 和 Thread2 都在做同样的事情,处理文件以及将图像文件 .jpg、.png 等添加到数据库中,图像的表示以数据校验和为键,因此如果两个文件包含相同的图像数据,则图像文件应该只添加一次。在添加到数据库之前,两者都检查是否存在具有匹配数据键的图像,但在检查和发现不匹配之间的过渡时期,然后创建图像现在可能存在导致异常。

4

0 回答 0