回答

收藏

Java Hibernate不必要的查询分离对象

技术问答 技术问答 436 人阅读 | 0 人回复 | 2023-09-14

我正在使用hibernate和c3p0 connectionpool插入、更新和删除许多分离对象。问题是,hibernate语句不会被批准处理,会9 A' u9 \9 @$ f: Y9 g# j
select @@session.tx_read_only在每个session.persist / insert / update / delete(object)之间。分析sql-9 c2 c) N+ m; }7 Z/ V4 ?
connection看上去像这样:
' y5 g/ C6 G8 c% ?: h/ O: \3 Iselect @@session.tx_read_onlyinsert...select @@session.tx_read_onlyinsert...select @@session.tx_read_onlyinsert...select @@session.tx_read_onlyinsert...select @@session.tx_read_onlyinsert...select @@session.tx_read_onlyselect @@ session.tx_rad_only总是返回“
- R% ?; R" ~5 s# Z/ q3 C3 ?; U0(当然)。我用无状态会话还是无状态会话都无所谓。最终的表现是不可接受的,超出了任何预期。
9 z2 O/ o. h/ R/ T0 Z! v2 R我的休眠配置:5 O5 r, N: u  D' h" x0 O+ p9 g( f% |
    org.hibernate.dialect.MySQLDialect    com.mysql.jdbc.Driver    jdbc:mysql://127.0.0.1:4040/xy?zeroDateTimeBehavior=convertToNull    xy    xy    false    false    false    false    org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory    org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider    5    20    300    250    3000    250    auto    true    true    false    org.hibernate.cache.ehcache.EhCacheRegionFactory    org.hibernate.cache.EhCacheProvider    true    hibernate_ehcache.xml我在用:
2 o3 o+ y% y' v        org.hibernate        hibernate-c3p0        4.3.5.Final                mysql        mysql-connector-java        5.1.31                org.hibernate        hibernate-entitymanager        4.3.4.Final                org.hibernate        ejb3-persistence        1.0.2.GA                org.hibernate        hibernate-ehcache        4.3.4.Final    我几乎没有冬眠的经历,这是一个很好的猜测,我犯了一个很大的错误,请随时提出任何建议。我睡觉了,因为ORM简单的功能jdbc准备好的语句,具有出色的快速性能。MYSQL服务器配置良好。  J# w8 ~2 t, k5 H
edit1:我知道:Hibernate不必要的查询-MySql  我的实体中没有事务注释,也没有定义隔离级别- Z! I4 m! u2 f9 G1 F3 Y
edit2:我将我的connectionpool更改为bonecp-问题依然存在。似乎是休眠的配置问题。
' d( a2 K0 `& X  O; \edit3:尝试了许多不同的操作,并发现了一些提示:如果我每5次手动插入一次session.flush()操作(如批量大小)[从休眠状态再次尝试批量示例,则5 j' o7 F( W" Q- Q: A: q9 ?( C
选择@@ session。tx_read_only    查询两次-每五次查询一次。所以我假设 选择@@ session.tx_read_only
$ D: i; S3 X' w5 Q! ^: i与冲洗有关。防止休眠刷新每个插入/更新的方法是什么?到目前为止,我已经尝试过了:session.setFlushMode(FlushMode.COMMIT /+ K4 [0 P- r, v, i0 i8 e+ L; a
NEVER /
4 r0 O. U/ h! U* Xetc),行为没有改变。也许我没有正确配置任何内容。…休眠触发什么来刷新每个插入?表上唯一的约束?休眠验证框架?复杂的对象图?并发难吗?也许是锁定问题(Hibernate不确定别人是否锁定了表格,不进行批处理,但检查表是否是每个只读的插入?
) H( L7 O- g+ p( b我没有发现与这种极端现象(我认为)相关的冲洗行为。# t9 e' ~+ [+ C/ ]
                                                               
0 }. }9 u, p% l  G    解决方案:                                                               
" {. F1 ?$ w. T  h8 P$ g                                                                我们只需要设置连接字符串useLocalSessionState = true这个问题可以解决。/ U6 ^" t/ z. i
详细说明了以下链接Mysql5.6和java连接器5.1.23中发生的ReadOnly更改的详细信息。% G0 t4 J& M* r: _* m6 _
http://dev.mysql.com/doc/relnotes/connector-j/en/news-5-1-23.html
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则