Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 356|回复: 0

[JDBC学习]JDBC编程优化策略总结

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 05:17:02 | 显示全部楼层 |阅读模式
    相比Hibernate、iBatis、DBUtils等,理论上JDBC的性能都超过它们。JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的。
       
       
         
       
       
        在一些高性能的数据操作中,越高级的框架越不适合使用。这里是我在开发中对JDBC使用过程中一些优化经验总结。
       
       
         
       
       
        1、选择纯java的JDBC驱动。
       
       
         
       
       
        2、使用连接池--使用一个“池”来管理JDBC连接,并精心调试池配置的参数,目前可用的数据库连接池很多很多。
       
       
        如何配置合适的参数呢,需要的是测试,而不是感觉。
       
       
         
       
       
        3、重用Connection--最大限度使用每个数据库连接,得到了就不要轻易“丢弃”。
       
       
        有时候在一个过程中,会多次操作数据库,而仅仅需要一个连接就够了,没必用一次就获取一个连接,用完后关闭或者入池。这样会增加“池”管理的成本,千万别以为你用了“池”就可以随便申请和归还连接,都是有代价的。如果是一个庞大循环块中操作数据库,更应该注意此问题!
         
      
       
       
         
       

         
       
      




    4、重用Statement--对于一些预定义SQL,设置为静态常量,并尽可能重用预定义SQL产生的PreparedStatement对象。对于多次使用一种模式的SQL,使用预定义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、代码高层优化--在以上的基础上,优化封装你的数据访问方式,尽可能让代码简洁好维护,如果你还觉得性能不行,那就该从整个系统角度考虑优化了,比如加上缓存服务器,集群、负载均衡、优化数据库服务器等等,以获取更好的系能。
    本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/225828


      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 07:12 , Processed in 0.398371 second(s), 54 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表