>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 24115 个阅读者 刷新本主题
 * 贴子主题:  【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面向对象编程-->Java语言的基本语法和规范
  JavaWeb开发-->JavaWeb应用入门(Ⅱ)
  JSP与Hibernate开发-->映射对象标识符
  Java网络编程-->RMI框架
  精通Spring-->计算属性和数据监听
  Vue3开发-->Vue指令
  【Vue.js技术专题】命名路由
  【Vue.js技术专题】自定义指令范例:v-drag指令
  【Spring Cloud Alibaba专题】ShardingSphere核心概念
  【Spring Cloud Alibaba专题】Nacos配置属性的持久化
  【Java基础编程专题】浮点数的格式化以及运算精度
  【Spring专题】用Spring框架进行文件下载
  【Spring专题】用AOP和SLF4J输出日志的范例
  从《精通Spring》和《精通Vue.js》的写作分享学习新技术的经...
  【持久化专题】JPA API的基本用法
  【持久化专题】EntityManager和Session的merge()方法详解
  【持久化专题】Spring与Hibernate与JPA的整合
  【Java网络编程专题】用Apache FTPClient在FTP服务器上创建目...
  【JavaWeb专题】在JavaWeb应用中对客户请求的异步处理
  【Java基础编程专题】Java基本类型和引用类型的三个区别
  我的计算机书籍创作心得
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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