hibernate-session提交的有关问题

hibernate-session提交的问题

事务传播:REQUIRED;

事务都是使用spring的声明式事务。

在项目中,要对一张表先进行查找,如果相同uri的数据存在就更新改数据,如果不存在就添加一条记录。

查操作

if(==1)

{update}

else

{add}

很简单的一个需求,当在高并发的情况下(写了一个线程池,6个核心线程、最大10个),相同uri就会出现多条记录。

可能哥们会说没同步,最初为了性能我使用的lock,发现不行,后来干脆使用synchronized将整个操作(查、添加、更新)都同步到一个方法中,发现还是不行。

断点跟踪(空表),发现在多余6个线程并发的情况下,第一个个线程在执行同uri查操作记录为0,ADD后,

第二个线程查操作记录还是为0........这就是问题的根源,按理来说应该为1.

 

我想:大概是hibernate自己管理hql没有同步到数据库,于是使用session.flush(),发现不行。

难道还没有同步:于是session.flush();再session.clear();结果还是悲剧!

 

在此我只能出绝招了:

session.setAutoCommit(false);

add()
session.commit();

session.setAutoCommit(true);

 

这样倒是可以。但是感觉很别扭。

不过长时间操作,会出错!这个是关键。有时hibernate在同步session会报异常。

 

于是我有想:

Connection conn = session.getConnection();

PreparedStatement ps = conn.PreparedStatement(sql);

ps.executeUpdate();

conn.commit();

session.flush();(安全起见,不过好像提交了就没必要了哈!)

ps.close;

conn.close;

这样到也可以,但是感觉还是别扭!不大对劲。

 

希望大侠们指点迷津啊,框架的东西没怎么看,不大懂啊!

 

在项目中大并发的情况下,有张表老是报死锁,发现对这张表同时有hql、sql操作。

偶然把sql改成hql居然没发现死锁了(可能也是偶然);

这个问题大家也给点意见。

头痛啊。。。。。。。。。。。书到用时方恨少啊!!

 

 

 

 

1 楼 zmty123 2011-06-07  
大家给点意见或建议撒!