14个Java持久化高性能技巧

  Java持久层是通过JDBC JPA或Hibernate进行数据库增删改查操作,经常成为性能瓶颈,这里有很多可以优化企业应用的技巧。

1.SQL语句日志

最好通过日志和测试机制进行每条语句的效率验证。这样能够捕捉到N+1查询问题。

2.连接管理

数据库连接是昂贵的,因此一定要用连接池。需要微调连接池的大小,比如使用 FlexyPool 这样的工具能够在生产环节进行微调连接池大小。

3.JDBC批处理

JDBC批处理能够在单个数据库请求中发送多条SQL语句,对于JDBC使用PreparedStataement.addBatch 和 PreparedStataement.executeBatch,Hibernate 5.2以后使用 Session-level batching

4.语句缓存

语句缓存是很少知道的优化措施,主要依赖底层的JDBC驱动,你能够缓存PreparedStatements在客户端也就是DJBC驱动的客户端,或缓存在数据库端。

5.Hibernate标识

当时有Hibernate时,IDENTITY产生器不是好的选择,因为它失效了JDBC批处理。而表产生器更不是好的选择,因为它使用了单独的事务机制来抓取新的ID标识,这会给底层事务日志增加负担。

SEQUENCE 是好的选择,从2012年以后每个数据库几乎都支持,Hibernate提供了 pooled or pooled-lo能够在抓取新的ID标识时降低数据库来回次数。

6.选择正确的数据列类型

越是贴切的类型获得效率越高,比如PostreSQL中inet类型用于IPv4地址,

7.关系

Hibernate有很多关系映射,但是不代表它们都有高的效率,对比表如下:

单向关系和@ManyToMany尽量避免,对于集合双向@OneToMany联合关系是推荐的。

不像查询,集合有很少的灵活性,如果一个集合中元素太多就不能嵌入一个对象中,因此,需要经常质疑集合是否必要。

8.继承

关系数据库和对象之间不匹配在使用继承时显得非常突出,JPA提供SINGLE_TABLE, JOIN, 和TABLE_PER_CLASS处理继承映射,每种办法都有优缺点。

9.持久上下文大小

持久上下文管理着实体状态的切换,将实体状态切换翻译到数据库的数据变化,Hibernate会自动侦测变化和根据我们的行为调度SQL UPDATE的运行,这个机制称为自动脏数据检查。

每次实体加载时,Hibernate会对实体属性值做一个复制,在flush写入数据库时候,每个被管理的尸体属性会和加载时这个复制快照值做对比。如果有任何一个实体属性值变化,Hibernate会自动检查所有被管理的实体,对于大数量的被管理实体,这种脏数据检查机制会有明显的CPU和内存损耗。

Hibernate5重新设计了字节码增强机制用来避免这种损耗。

10.只在需要时抓取

一次性抓取太多数据会引起性能问题,EAFER抓取是坏的,避免Open-Session in View之类反模式。

11.缓存

关系数据库会使用很多内存缓存避免数据库直接访问,因此配置数据库缓存变得很重要。同时应用缓存只提供读取数据的性能提升。二级缓存能够提高读写事务的响应时间,

12.并发控制

事务隔离级别ACID对于性能和数据完整性是重要的,对于多请求Web流程,防止修改同一条记录或字段。尽量使用无版本乐观并发控制。使用detache实体的乐观锁或EXTENDED持久上下文等方式。

13.释放数据库查询能力

使用各种原生SQL进行查询,提升数据库查询能力

14.纵向扩展和横向控制

使用数据库复制和分区进行性能扩展和提升。

 

11个JPA和Hibernate查询配置小技巧

性能专题

Hibernate专题