相关文章推荐
霸气的毛衣  ·  GitLab ...·  2 年前    · 
性感的饼干  ·  Raspberry Pi 4 上的 ...·  2 年前    · 
文质彬彬的红豆  ·  [译]bootstrap-select ...·  2 年前    · 

将数据库连接配置的自动提交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设