将数据库连接配置的自动提交auto-commit关闭,
使用Spring/Spring Boot框架连接数据库时,如果使用的是非JTA事务,也就是JDBC事务,称为resource-local本地资源事务,应该将连接池(例如HikariCP)中的自动提交禁止,同时配置Hibernate如下配置属性,这样能够延迟Hibernate的连接获取时间,大大提高性能:
在Hibernate中,数据库连接获取以及连接释放与当前正在运行的事务的类型有关:
1. resource-local本地资源:适用于JDBC事务,针对一个DataSource,当事务开始,Connection立即获取;在事务结束时关闭(提交或回滚也是)
2. JTA:适合XA事务,可跨越多个DataSource(s),Connection是在第一次执行SQL语句 时获得,每条语句执行后释放。如果底层应用服务器允许,可以忽视这种积极的连接释放机制。
我们的目标是使资源本地事务像JTA一样延迟Connection的获取,直到Hibernate需要执行第一条JDBC语句。
为什么Hibernate会立即获得Connection呢?因为Hibernate需要获得Connection以后检查底层JDBC Connection的自动提交状态,如果Connection设置为自动提交,Hibernate要去禁用它,并确保SQL语句在同一数据库事务的上下文中执行,虽然这种行为是正确的,因为Hibernate如果不获得Connection就无法知道自动提交标志是否已设置。
我们可以提示Hibernate跳过此检查,因为我们已经知道所有JDBC Connection(s)都以手动提交模式运行。所有企业应用程序都已使用连接池,可在数据库连接建立第一时间内禁用自动提交模式。
HikariConfig hikariConfig = super.hikariConfig( dataSource );
hikariConfig.setAutoCommit( false );
出于这个原因,Hibernate 5.2.10引入了hibernate.connection.provider_disables_autocommit配置属性,该属性告诉Hibernate:底层的JDBC Connection(s)已经禁用了自动提交模式。
性能对比有很大提高
将数据库连接配置的自动提交auto-commit关闭,使用Spring/Spring Boot框架连接数据库时,如果使用的是非JTA事务,也就是JDBC事务,称为resource-local本地资源事务,应该将连接池(例如HikariCP)中的自动提交禁止,同时配置Hibernate如下配置属性,这样能够延迟Hibernate的连接获取时间,大大提高性能:在Hibernate中,数据库连接获取以及...
亲爱的大家,
我敢肯定,你们中的许多人都在使用
Hibernate
和
MySQL
,我自己在这里和那里都使用它。 通常,编程模型是不错的,但是普通的JDBC可以快得多已经不是什么秘密了。 在这篇文章中,我想引起您的注意
Hibernate
在您
MySQL
服务器中引起的一个小问题。
如果跟踪
Hibernate
发送到
MySQL
数据库SQL,就会发现一致地,
Hibernate
以“ SET
auto
c...
hibernate
是一款orm框架,完全面向对象操作。除了原生sql查询基本都是以对象来进行数据库操作
#
hibernate
相对mybatis,可以做到无跨数据库,接下来讲解一下
hibernate
首先,我们使用
hibernate
时候,需要用到2个配置文件,与spring整合后,有些人将
hibernate
的主配置放到spring中了,为了不造成太多的配置文件
1.orm元数据 2.主配置文件
or...
做了不少项目,遇到不少
hibernate
配置,对于
hibernate
.connection.
auto
commit
值的设置,存在很多争议,一些人认为应该设置为true,一些人认为应该设置为false,而我坚决选择后者,下面就来讲讲我的理由吧
1、当在做业务系统的时候,大家都知道会在同一个操作中,一个业务可能包含多个子业务,那么就要进行多次
提交
,假设“业务A”中包含“子业务1”、“子业务2”、“子业...
今天在网上看到文章说使用
Hibernate
y应该尽可能使用
事务
,而且说如果不使用
事务
,则必须在配置文件
hibernate
.cfg.xml里加上true才行,因为没有这句
Hibernate
的Session会在获得connection后
自动
将connection的
auto
commit
设置为false.会导致数据库没有改变。之后看到一篇从Java
Persist with
Hibernate
中节选的
在
hibernate
的配置文件中添加
自动
提交
事务
,在对数据库操作时使用save,get方法时就不需要开启和关闭
事务
。但是delect和update语句无法执行,也就是说
自动
开启
事务
对delect方法无效。
对于删除操作,一般都是先获取需要删除的对象然后再执行删除操作,这样需要执行两个语句,
性能
不太好,其实删除的时候只用到了主键,所以我们可以创建一个对象,只传入主键属性,然后就可以之间根据这个对象删...
最近我们学到的
Hibernate
中,有个对房屋信息的查询功能。其中页面的一句代码如下:
${house.street.district.name}区${house.street.name},${house.floorage}平米 联系方式:${house.contact}
以上写法用EL显示房屋的信息,但我们的DAO用
Hibernate
实现的时候,几个相关的对象都要把lazy设