JDBC优化策略总结

简介:
相比Hibernate、iBatis、DBUtils等,理论上JDBC的性能都超过它们。JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的。
 
在一些高性能的数据操作中,越高级的框架越不适合使用。这里是我在开发中对JDBC使用过程中一些优化经验总结。
 
1、选择纯Java的JDBC驱动。
 
2、使用连接池--使用一个“池”来管理JDBC连接,并精心调试池配置的参数,目前可用的数据库连接池很多很多。
如何配置合适的参数呢,需要的是测试,而不是感觉。
 
3、重用Connection--最大限度使用每个数据库连接,得到了就不要轻易“丢弃”。
有时候在一个过程中,会多次操作数据库,而仅仅需要一个连接就够了,没必用一次就获取一个连接,用完后关闭或者入池。这样会增加“池”管理的成本,千万别以为你用了“池”就可以随便申请和归还连接,都是有代价的。如果是一个庞大循环块中操作数据库,更应该注意此问题!
除此之外,还应该对连接进行密集使用,尽可能晚的打开,并可能早的关闭。比如,你一个业务中有N多的操作,数据库操作穿插在其中,而其他的业务处理操作时间很长,那么使用一个连接处理这些操作是有问题的。这会导致长期占用连接,给数据库带来压力。
 
4、重用Statement/PreparedStatement--对于一些预定义SQL,设置为静态常量,并尽可能重用预定义SQL产生的PreparedStatement对象。对于多次使用一种模式的SQL,使用预定义SQL可以获取更好的性能。对于Statement对象,可以反复的重用,每次都可以接收不同的SQL语句,而对于PreparedStatement则不可以,因为预定义SQL在定义PreparedStatement对象时候已经确定了,但是如果sql语句不变,则可以调用clearParameters()来达到从用目的,如果sql语句发生变化,也可以从用变量名。
 
5、使用批处理SQL。
 
6、优化结果集ResultSet--查询时候,返回的结果集有不同的类型,优先选择只读结果集、不可滚动的属性。
这里是很容易出现问题的地方:
java.sql.ResultSet 

static  int CLOSE_CURSORS_AT_COMMIT    
                    该常量指示调用 Connection.commit 方法时应该关闭 ResultSet 对象。    
static  int CONCUR_READ_ONLY    
                    该常量指示不可以更新的 ResultSet 对象的并发模式。    
static  int CONCUR_UPDATABLE    
                    该常量指示可以更新的 ResultSet 对象的并发模式。    
static  int FETCH_FORWARD    
                    该常量指示将按正向(即从第一个到最后一个)处理结果集中的行。    
static  int FETCH_REVERSE    
                    该常量指示将按反向(即从最后一个到第一个)处理结果集中的行处理。    
static  int FETCH_UNKNOWN    
                    该常量指示结果集中的行的处理顺序未知。    
static  int HOLD_CURSORS_OVER_COMMIT    
                    该常量指示调用 Connection.commit 方法时不应关闭 ResultSet 对象。    
static  int TYPE_FORWARD_ONLY    
                    该常量指示指针只能向前移动的 ResultSet 对象的类型。    
static  int TYPE_SCROLL_INSENSITIVE    
                    该常量指示可滚动但通常不受其他的更改影响的 ResultSet 对象的类型。    
static  int TYPE_SCROLL_SENSITIVE    
                    该常量指示可滚动并且通常受其他的更改影响的 ResultSet 对象的类型。
 
说明下:
 
结果集分两种类型:只读和可更改,只读的话,更省内存,查询的结果集不能更改。如果结果集在查询后,更改了值又要保存,则使用可更改结果集。
 
结果集的游标也有两种类型:如果没必要让游标自由滚动,则选择单方向移动的游标类型。
 
对于是否并发操作:如果不需要考虑线程安全,则选择忽略并发的结果集类型,否则选择并发安全的类型。
 
另外,还要控制结果的大小,几乎所有的数据库都有查询记录条数控制的策略,可以海量数据进行分批处理,一次一批,这样不至于把系统搞死。
 
7、事物优化--如果数据库不支持事物,就不要写回滚代码,如果不考虑事物,就不要做事务的控制。
 
8、安全优化--管理好你的Connection对象,在异常时候能“入池”或者关闭。因此应该将Connection释放的代码写在异常处理的finally块中。
 
9、异常处理优化--不要轻易吞噬SQLException,对于DAO、Service层次的数据访问,一般在DAO中跑出异常,在Service中处理异常。但DAO中也可以处理异常,并做转义抛出,不要随便抛出RuntimeExeption,因为这是JVM抛出的,不需要你可以去抛出,因为RuntimeException往往会导致系统挂起。
 
10、代码高层优化--在以上的基础上,优化封装你的数据访问方式,尽可能让代码简洁好维护,如果你还觉得性能不行,那就该从整个系统角度考虑优化了,比如加上缓存服务器,集群、负载均衡、优化数据库服务器等等,以获取更好的系能。


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/225828,如需转载请自行联系原作者
相关文章
|
5月前
|
关系型数据库 MySQL Java
(详解与使用)Sharding-JDBC通过mysql主从复制来进行项目优化
(详解与使用)Sharding-JDBC通过mysql主从复制来进行项目优化
37 0
|
8月前
|
druid Java 数据库连接
JDBC连接优化
JDBC连接优化
41 0
|
9月前
|
Java 数据库连接 数据库
JDBC快速入门(三) 代码再优化
JDBC快速入门(三) 代码再优化
|
SQL 监控 Java
如何避免JDBC池和内存溢出?优化策略大揭秘!
0 目标 生成订单接口的基准场景是什么结果。 SQL的问题定位
438 0
|
SQL Java 关系型数据库
|
SQL 关系型数据库 Java
01_数据库连接池,数据源,ResultSetMetaData,jdbc优化
 一、数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接。 这样的方式会导致用户每次请求都要向数据库建立链接而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的
1508 0
|
SQL 关系型数据库 Java
14-数据库连接池和jdbc优化
一、数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接。 这样的方式会导致用户每次请求都要向数据库建立链接而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服
2334 0
|
4月前
|
SQL Java 关系型数据库
MySQL之JDBC(二)
MySQL之JDBC(二)
34 0