首页 > 数据库 >Java程序优化访问数据库的技巧集锦

Java程序优化访问数据库的技巧集锦

时间:2023-10-17 13:02:33浏览次数:63  
标签:语句 Java 集锦 数据库 ResultSet 索引 字段 Statement

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

Java程序优化访问数据库的技巧集锦_字段

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)。

上文参考孙卫琴的经典Java书籍《Java网络编程核心技术详解》。

Java程序优化访问数据库的技巧集锦_取值_02


标签:语句,Java,集锦,数据库,ResultSet,索引,字段,Statement
From: https://blog.51cto.com/sunweiqin/7902092

相关文章

  • Java拾贝第四天——String和匿名对象
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么复习突然发现String没写匿名对象只在堆内存中开辟空间,栈内存中没有对其进行引用的一种对象。(会等待被GC清除)publicclassTest4{publicstaticvoidmain(String[]args){newNoname("匿名对象");}}......
  • Spring 操作 达梦数据库
    Spring操作达梦数据库 一、前提条件本篇博客以访问本地达梦数据库(DM8)为基础进行演示。(前提:本地已经安装了DM8数据库!)关于Windows安装达梦数据库,请参考博客:Windows安装达梦数据库关于Docker安装达梦数据库,请参考博客:Docker安装达梦数据库关于JDBC方式操作达梦......
  • PHP轮子批量替换数据库前缀
    <?phpinclude_once('fix_mysql.inc.php');//设置好相关信息echo'<metacharset="utf-8">';$dbserver='localhost';$dbname='test';//替换成你的数据库名$dbuser='root';//替换成你的数据库用户名$dbpassword='123......
  • mybatis-generator生成sqlite3数据库代码
    问题问题:使用mybatis-generator生成sqlite3的代码时,金额是double,时间是string类型表格式如下CREATETABLEtest(idintegerprimarykeyautoincrement,--idamountnumberic,--金额create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP,......
  • 【Java 并发编程】synchronized
    synchronized关键字synchronized是Java中的一个关键字,翻译成中文是同步的意思,主要解决的是多个线程之间访问资源的同步性,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。使用方法修饰实例方法给当前对象实例加锁,进入同步代码前要获得当前对象实例的锁......
  • 【Java 并发编程】ReentrantLock
    目录ReentrantLock公平锁和非公平锁synchronized和ReentrantLock有什么区别?ReentrantLockReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等......
  • 【Java 并发编程】ThreadLocal
    目录ThreadLocalThreadLocal实现线程隔离的原理ThreadLocal内存泄漏场景ThreadLocalThreadLocal是一个将在多线程中为每一个线程创建单独的变量副本的类;当使用ThreadLocal来维护变量时,ThreadLocal会为每个线程创建单独的变量副本,避免因多线程操作共享变量而导致的数据不......
  • SQL_导出SQLserver数据库表和数据
    1.选择数据,右键。任务----生成脚本 2.选择具体的数据库对象 3.输入要保存的路径,点击高级。  4.在高级脚本编写选项中,选择架构和数据 ......
  • U8 数据库表结构
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★1、.ufysftem库      此库是系统参数数据库,其中主要存放各个帐套的共用信息,意义很大,日常应用的也很多。      A.ua_account:是帐套信息表,其中系统帐套存放路径、帐套启......
  • java serverlets使用数据源连接oracle数据库,并执行查询操作代码
    packagechap03;importjava.io.IOException;importjava.io.PrintWriter;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.PreparedStatement;importjava.sql.Statement;importjava.u......