我在Eclipse RAP应用程序中使用Hibernate。我有数据库表映射到具有Hibernate的类,这些类具有懒惰获取的属性(如果这些不是懒散地获取,那么我可能最终在我的第一个查询时将整个数据库加载到内存中)。我不同步数据库访问,因此用户有多个Hibernate Sessions
,让DBMS执行事务隔离。这意味着获取的数据的不同实例将属于不同的用户。有些事情如果用户更改了这些内容,那么我想更新多个用户。目前我正在考虑在这些情况下使用Hibernate session.refresh(object)
来刷新数据,但我不确定这会在刷新多个对象时如何影响性能,或者它是否是正确的方法。< / p>
希望我的问题很清楚。我的approch问题是好还是从根本上有缺陷还是我错过了什么?这种问题有一般的解决方案吗?
对此我有任何意见。
答案 0 :(得分:1)
一般解决方案是
如果每个事务都很短并且事务A将某个对象从O更新为O',则并发事务B只会在提交或回滚之前看到O,并且在A之后启动的任何其他事务将看到O',因为新会话从事务开始。
答案 1 :(得分:1)
我们维护的应用程序完全符合您的要求。是的,每个session.refresh()都会命中数据库,但由于所有会话将同时刷新同一行,因此数据库服务器将从内存中回答所有这些查询。
您还需要解决的唯一问题是如何传播某些内容已发生变化并需要重新加载到所有其他会话的信息,甚至可能传播到其他主机上的会话。
对于我们的应用程序,我们在RCP上有大约30个用户,在RAP实例上有10-100个用户,这些用户都连接到同一个DB后端(尽管通过pgpool)。我们使用每个运行时连接的小型网络服务;当事务提交时,应用程序告诉此更改服务“表T的行ID X”已更改,然后将其传播到所有其他“更改订户”,甚至跨JVM。
但是:确保在属于该会话的线程中调用session.refresh(),可能是RAP-Display线程。不要从Jobs或其他不相关的线程调用refresh()。
只要您没有大量用户在短时间内更新大量行,我想您不必担心性能。