>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 24090 个阅读者 刷新本主题
 * 贴子主题:  【Java网络编程专题】优化访问数据库的程序代码的一些技巧 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2019-12-20 16:15:19     消息  查看  搜索  好友  邮件  复制  引用

本文参考《Java网络编程核心技术详解》,作者:孙卫琴,电子工业出版社出版

大多数应用程序都需要访问数据库。据统计,在一个应用中,通过JDBC访问数据库的代码会占到30%左右。访问数据库的效率是决定程序的运行性能的关键因素之一。提高程序访问数据库的效率的总的原则是:减少建立数据库连接的次数,减少向数据库提交的SQL语句的数目,及时释放无用的Connection、Statement和ResultSet对象。下面总结了用于优化访问数据库代码的一些细节。

1.选择合适的JDBC驱动器

一般说来,应该优先考虑使用第3类和第4类驱动器,它们具有更高的运行性能,只有当这两类驱动器不存在的情况下,才考虑用第1类和第2类驱动器作为替代品。

2.优化数据库连接

采用连接池来重用有限的连接,减少连接数据库的次数。

3.控制事务

如果事务中包含多个操作,应该在手工提交模式下提交事务。此外,可通过Connection接口的setTransactionIsolation(int level)方法设置合适的事务隔离级别,如果希望应用程序有较好的并发性能,就要设置低一点的隔离级别。

4.优化Statement

如果一个SQL语句会被多次重复执行,应该使用PreparedStatement,而不是Statement。此外,对于大批量的更新数据库的操作,可以用Statement或者PreparedStatement来进行批量更新,与此相关的方法为:
addBatch(String):加入一个操作。
executeBatch():执行批量更新操作。

5.优化ResultSet

优化ResultSet体现在以下几个方面:
(1) 通过ResultSet、Statement或者Connection的setFetchSize()方法,来设置合理的批量抓取数据库中数据的数目。
(2) 如果不需要对结果集滚动和更新,那么应该采用默认的不支持滚动和更新的结果集,因为这种类型的结果集占用较少的系统资源,运行速度更快。
(3) 在ResultSet的getXXX()或setXXX()方法中,指定字段的索引位置比指定字段的名字具有更好的性能,例如以下第一段程序代码的性能优于第二段代码:


//第一段程序代码,指定字段的索引位置
setLong(1,100);
setString(2,"Tom");

//第二段程序代码,指定字段的名字
setLong("ID",100);
setString("NAME","Tom");

       (4) 优化查询语句,运用表连接把多个查询语句合并为一个查询语句,从而减少向数据库提交的查询语句的数目。

6.及时释放无用的资源

及时显式地关闭无用的ResultSet、Statement和Connection对象。

7.合理建立索引

索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。索引的使用要恰到好处,其使用原则如下:
(1) 为经常参与表连接,但是没有指定为外键的字段建立索引。
(2) 为频繁参与排序或分组(即进行“group by”或“order by”操作)的字段建立索引。
(3) 在where条件表达式中,为具有多种取值的字段建立检索,不要为仅有少量取值的字段建立索引。假定CUSTONERS表具有NAME(姓名)字段和SEX(性别)字段,这两个字段都会经常出现在where条件表达式中。NAME字段有多种取值,而SEX字段只有“female”和“male”两种取值,因此只需为NAME字段建立索引,而没有必要为SEX字段建立索引。如果对仅有少量取值的字段建立索引,那么不但不会提高查询效率,还会严重降低更新数据的速度。
(4) 如果待排序的字段有多个,可以为这些字段建立复合索引(Compound Index)。



程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 admin 在 2021-10-09 10:56:00 重新编辑]
  Java面向对象编程-->对象的生命周期
  JavaWeb开发-->自定义JSP标签(Ⅰ)
  JSP与Hibernate开发-->立即检索和延迟检索策略
  Java网络编程-->通过JDBC API访问数据库
  精通Spring-->组合(Composition)API
  Vue3开发-->通过Axios访问服务器
  【Vue.js技术专题】路由导航中抓取数据
  【Vue.js技术专题】Vuex中异步操作
  【Spring Cloud Alibaba专题】GateWay的内置断言工厂
  【Spring Cloud Alibaba专题】Seata的架构
  向小伙伴们推荐我所创作前后端编程书籍的学习顺序
  【Spring专题】Spring MVC是否过时?
  【Spring专题】服务器端推送
  【Spring专题】@Query和@Modifying注解的增删改操作
  【持久化专题】用@MapsId注解映射派生主键
  【持久化专题】JPA API的基本用法
  【持久化专题】EntityManager和Session的merge()方法详解
  【Java网络编程专题】用Java套接字访问HTTP服务器读取网页数...
  【Java网络编程专题】异步通道和异步运算结果
  【Java网络编程专题】通过JDBC API调用存储过程
  《大话Java程序设计从入门到精通》写作花絮
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。