求教达人:hibernate的一点问题

操作步骤:
第一步:新增记录a,但是,不提交,一直等待。(1)
第二步:新增记录b,并提交,能正常插入到数据库。(2)
第三步:让(1)提交。(3)

问题:
在(3)的时候,a记录没有插入到数据库中。

环境:
mysql,hibernate(主键生成方式:native)

请问:
有什么方式能解决这种问题 ?在集群环境下会出现这种情况么?

针对你描述的问题 尝试从以下两方面寻找原因:
1.尝试更换其他负载均衡方式 (使用weblogic或者硬负载均衡)
2.从hibernate本身查找原因
重点分析一下2)
可以尝试设置hibernate的事务隔离级别 1,2,4,8
[code="xml"]
4
[/code]
考虑当前hibernate的事务管理方式,集群环境建议使用JTA事务,配置如下
[code="xml"]

net.sf.hibernate.transaction.JTATransactionFactory

[/code]

先不说集群环境 我觉得还是先从你的代码结构和日志上分析吧

也许是你逻辑错误呢 不在同意会话中 会发生类似用例

个人感觉,为什么不先第二步,在第一步?

可以考虑一下flush一下,猜测可能会和缓存有关系。

[quote]操作步骤:
第一步:新增记录a,但是,不提交,一直等待。(1)
第二步:新增记录b,并提交,能正常插入到数据库。(2)
第三步:让(1)提交。(3) [/quote]
一个session中?还是两个啊?一个中能够只提交b?

嗯 hibernate可恨在这 对并发事务处理需要仔细斟酌
如果相同会话 可能是表锁定或者行锁定
你看一下[url]http://www.blogjava.net/pengpenglin/archive/2010/03/15/315443.html[/url]
如果是不同会话 那想办法提交事务 就可以了

[quote]missoasis 写道
引用
操作步骤:
第一步:新增记录a,但是,不提交,一直等待。(1)
第二步:新增记录b,并提交,能正常插入到数据库。(2)
第三步:让(1)提交。(3)

一个session中?还是两个啊?一个中能够只提交b?

N个session.
N个client-->apache-->N个tomcat [/quote]
n个怎么会互相影响那?如果a与b不在同一个session中,那么他们怎么会互相影响的啊?

嘎,瞎猜一下
查看下你的hibernate的缓存配置,EC呢还是memory?是共用了1个缓存呢,还是分散到各自的硬盘中就缓存了。

然后事物级别上,也有可能。

你试试b提交以后flush一下,看看a是不是有变化之类的。

我也想不通为啥,只能猜测+讨论了。
大概想一下你的模拟环境,开两个浏览器,一个做操作过程中被咔嚓一下,另外一个顺利进行,完成后,咔嚓的那个在继续。

hibernate会不会认为这是一个啊?

如果是这样的话,肯定是集群或者hibernate或者事务上没弄好。
至少我们现在的项目就木有这个问题,环境应该和你说的一样,压力我想肯定会比你的大,不过用F5做的负载。

大负载的情况下,考虑一下增加数据库的连接数,我们有个项目,在连接数500的时候就时常性的丢数据,但是到800了,就没问题了,原因一直都找不到。
一味的增加链接数不是解决问题的根本,也希望楼主能有个好的解决办法,偶也借鉴借鉴~~~。

[quote]a/b都是往一个表插入的。
你的意思是不是,add记录a,到commit记录a,这个过程是原子操作?这个时间段里面其他hibernate不会add+commit ? [/quote]
昨天与一跟们讨论了一下,得出的结论是可能你hibernate运用上出了问题,与集群无关,你能不能做批量插入那?你现在用的是批量执行的方法吗?

[quote]
a/b都是往一个表插入的。
你的意思是不是,add记录a,到commit记录a,这个过程是原子操作?这个时间段里面其他hibernate不会add+commit ? [/quote]
如果你a,b是放在同一个session中,你调用的又是能够批量执行的方法,那么你才save b后,commit,a,b应该是能够都被插入到数据库,建议你检查你的循环,还有你打开session的方式

[quote]如果是在一台机子上当然是没问题的,hibernate自己会控制好,但是,如果在多台机子上往一个表里面插数据就可能有问题了。[/quote]
多台机子上?什么意思?难道a跟b的操作在两台机器上?那a跟b肯定不在一个session中,那么a,b怎么相互影响那?

打印HIBERNATE的SQL出来看看不就知道了?

个人认为你的b要么提交失败了,要么没提交,否则不太可能

我还是认为是你hibernate的使用有问题
请问你保存对象用的是什么方法

嘎嘎,回答的人还真不少,我突然想起你用atomiks了?如果没用的话建议你用用这个。