问个关于能否使用Hibernate的问题

我们的数据库服务器将由两套系统来访问,一套是遗留的C/S结构的系统,一套是即将开发的B/S结构的系统,两套系统操作的是同样的表,只是针对的业务不一样,遗漏系统里面大量使用了存储过程。

在这样的情况下,即将开发的B/S结构的系统里面可以使用Hibernate来实现持久化层吗?因为Hibernate也有自己的缓存,我在想如果两套系统同时访问的数据有交集时,会不会出问题啊?

有两种情况需要考虑:

1.你的系统(其中一个或两个)是否对数据实时性要求很高而你的数据又会经常被修改,如果是这样的话,会比较麻烦,因为Hibernate是可以通过乐观锁(或悲观锁,但这种方式会严重浪费数据库资源,一般不是很建议使用)来防止数据脏读脏写的问题,如果你的系统实时性要求很高需要使用乐观锁的话,由于两个系统不能使用同一个Hibernate上下文,这种情况使用乐观锁无法达到防止数据脏读脏写的目的。

2.你的系统(使用Hibernate那个)有没有使用Hibernate的二级缓存,如果有,还要看你使用二级缓存的策略,同样的道理,两个系统不能共享同一个Hibernate的二级缓存,至于一般的Hibernate的应用,只使用了一级缓存,即Hibernate Session期间的缓存,就不会有你锁担心的问题。
[该贴被johnnylzb于2008-02-25 10:18修改过]

谢谢,不过我还不是很明白~~~

这么问吧:

如果说我现在在B/S结构的那个系统里面只使用一级缓存,您说的这两种情况是不是就都可以避免了?

只能避免第二种情况,第一种情况无法避免,第一种情况即使使用JDBC,也无法解决,需要在数据库级做“锁”。

举个例子:

两个应用程序A、B同时修改帐户Account的余额Balance(注:以下事件按时间顺序发生):

A读取Acccout Banlace(balance=5000)

A执行修改: balance = balance - 1000 (balance=4000)

B读取Acccount Balance(balance=5000)

A提交结果(balance=4000)

B执行修改:balance = balance - 1000 (balance=4000)

B提交结果(balance=4000)

可以看到,实际上,Account被扣款两次共2000元,但实际上,B读取数据的时候是“脏读”,结果最后帐户还剩下4000余额,这是一个事务干扰的例子。假设应用B是B/S结构,使用了Hibernate(或者JDBC或其他),在B读取到修改提交这段时间,A对帐户余额的改变对B(即使Hibernate使用的是一级缓存)是透明的,从而导致了B的脏读脏写。

非常感谢您举了这么详细的例子!

那么假定用户A、B都是在同一个C/S或者B/S结构的系统中,就能保证不出现脏读脏写了吗?

请教:
如果在C/S系统中,A和B同时读取了某条数据,然后A将其修改,那么B再次读取的时候,Hibernate应该是直接从缓存中读取吧,这样的话,B读到的是修改之前的数据了。这个问题会不会有呢,如何解决呀?

不用Hibernate吧。这种系统IBatis或者直接JDBC都挺好。

Hibernate通常比较适合与新的项目,不适合于已有项目。