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居然没发现死锁了(可能也是偶然);
这个问题大家也给点意见。
头痛啊。。。。。。。。。。。书到用时方恨少啊!!