谈谈优化JDBC数据库编程
创始人
2024-04-16 22:21:32
0

JDBC数据库编程1.尽量减少对数据库元数据方法的使用

同样是产生一个ResultSet对象,DatabaseMetaData 对象的方法比其它JDBC方法相对要慢,因此平繁使用该方法会降低系统的性能。 在程序中应当对产生的结果集信息进行高速缓存,比如将getTypeInfo()返回的结果集存入Vector或Hashtable中,这样可大大提高程序的效率。

JDBC数据库编程2.应避免的方法调用模式

在方法调用时应当尽量避免传入null做为参数,虽然有时能执行成功,但这对DB Server负担很重。其实在很多情况下所需的参数是已知的。比如:

  1. //这里略去了捕获违例代码(下同)。  
  2. DatabaseMetaData md=...;  
  3. ResultSet rs=md.getTables(null,null,"authors",null);//取得MS SQL SERVER pubs数据库中authors表的信息. 

应当写成:

  1. ResultSet rs=md.getTables("northwind","dbo","authors",new String[]{"TABLE"}); 

这样使程序更有效可靠。

JDBC数据库编程3.使用哑查询语句来取得表的相关特征信息

一个哑查询语句(Dummy Query,译为哑查询不知是否恰当,愿与大家探讨)不会产生有记录的结果集,比如:select * from tableName where 1=0,因为条件永不成立,DB Server 不会执行这条语句。因此,在不需产生记录行的情况下,哑查询能极大地提高程序的执行效率。比如我们要了解一个表的有关列信息时,上面的语句比select * from tableName这个语句要高效得多,后者数据库服务器要检索所有的行并返回一个记录集,而前者不需要。针对这一问题,JDBC可以有以下两种方法:

  1. case1:使用getColumns()方法
  2. //getColumns()是DatabaseMetaData的一个方法,其有关信息请查阅JDK1.3文档
  3. ResultSetrs=md.getColumns("pubs","dbo","authors",...);//返回一个有记录的结果集
  4. while(rs.next())//通过滚动结果集取得列名
  5. System.out.println(rs.getString(4));
  6. case2:使用getMetaData()方法
  7. Statementstmt=conn.createStatement();
  8. //数据库服务器永远不会执行这条查询语句
  9. ResultSetrs=stmt.executeQuery("select*fromauthorswhere1=0");
  10. ResultSetMetaDatarsrsmd=rs.getMetaData();
  11. intcolCount=rsmd.getColumnCount();//取得列数
  12. for(intcol=1;col<=colCount;col++)
  13. System.out.println(rsmd.getColumnName(col));
  14. //!这里列的顺序是select后列出现的顺序,并不一定与表中列顺序对应

通过以上的分析,第二种方法应是我们的选择。

JDBC数据库编程4.关于存储过程的调用

由于所有的JDBC驱动总是将SQL语句作为字符串发送到数据库服务器,数据库服务器经过语法分析、参数类型验证,然后将参数转换成正确的数据类型再去执行。比如有这么一个存储过程:

  1. CallableStatementcstmt=conn.prepareCall("{callgetCustomerName(123)}");
  2. //获得指定id的客户的名字,输入参数,id是个正整数
  3. ResultSetrs=cstmt.executeQuery();

在这里我们认为123是一个正整数,但实际"call getCustomerName(123)"作为字符串整个被发送到数据库服务器端,数据库服务器经过分析,离析出"123"将其转换为整数型值再做为参数送给存储过程执行。很明显,这样效率极低,因为我们把已知的东西仍要服务器去判断,这无疑额外加重了服务器的负担。做为优化也是我们常见的存储过程的调用方法应是:

  1. CallableStatementcstmt=conn.prepareCall("callgetCustomerName(?)");
  2. cstmt.setLong(1,123);//将值和类型信息编码后发送
  3. ResultSetrs=cstmt.executeQuery();
  4. //dosomething

JDBC数据库编程5.正确使用Statement和PreparedStatement对象及其execute方法

Statement 对象是为仅执行一次的查询语句优化而设计的,PreparedStatement 对象是为两次或更多次执行同一查询语句而设计的。PreparedStatement 对象第一次执行一个准备好的查询要花一定的代价,然而它带来的好处是为以后的查询加快了速度;因为SQL语句已经进行编译并放入高速缓存,你可以一直重复使用;想要改变查询条件获得不同的结果集只需用setXXX方法改变主机变量(?)的值就行了。

由于PreparedStatement 及 CallableStatement都是Statement的子类,所以它们都有execute(String sql),executeQuery(String sql),executeUpdate(String sql),executeBatch()方法。

execute(String sql)方法返回一个boolean值,它执行任意复杂的sql语句,可以产生多个结果集。如果有结果产生返回 true,如果没有结果集产生或仅是一个更新记数则返回 false。它产生的结果集可以通过getResultSet()和getMoreResults()获得,更新记数可通过getUpdateCount()获得。显然execute(String sql)方法的使用要复杂一些,因此如果只是简单的查询或更新操作请使用executeQuery(String sql)和executeUpdate(String sql)方法。executeUpdate(String sql)能执行INSERT,UPDATE,DELETE语句,及DDL和DML命令(此时返回值为0)。

如果需要进行更多的更新操作,只需将这些更新命令打包后一起提交给数据库,数据库一次处理所有的请求,这比逐条提交要高效得多。例如:

  1. //保存当前提交模式
  2. booleancommitState=conn.getAutoCommit();
  3. //关闭自动提交模式
  4. conn.setAutoCommit(false);
  5. Statementstmt=conn.createStatement();

【编辑推荐】

  1. 浅谈通过使用JDBC的statement进行数据操作
  2. Java高手详解使用JDBC的步骤
  3. 浅谈DB2 JDBC驱动程序及其支持的功能
  4. 详解JDBC与Hibernate区别
  5. JDBC连接MySQL数据库关键四步
  6. 浅谈JDBC的概念理解与学习

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...