• JDBC优化策略总结


    相比Hibernate、iBatis、DBUtils等,理论上JDBC的性能都超过它们。JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的。
     
    在一些高性能的数据操作中,越高级的框架越不适合使用。这里是我在开发中对JDBC使用过程中一些优化经验总结。
     
    1、选择纯Java的JDBC驱动。
     
    2、使用连接池--使用一个“池”来管理JDBC连接,并精心调试池配置的参数,目前可用的数据库连接池很多很多。
    如何配置合适的参数呢,需要的是测试,而不是感觉。
     
    3、重用Connection--最大限度使用每个数据库连接,得到了就不要轻易“丢弃”。
    有时候在一个过程中,会多次操作数据库,而仅仅需要一个连接就够了,没必用一次就获取一个连接,用完后关闭或者入池。这样会增加“池”管理的成本,千万别以为你用了“池”就可以随便申请和归还连接,都是有代价的。如果是一个庞大循环块中操作数据库,更应该注意此问题!
    除此之外,还应该对连接进行密集使用,尽可能晚的打开,并可能早的关闭。比如,你一个业务中有N多的操作,数据库操作穿插在其中,而其他的业务处理操作时间很长,那么使用一个连接处理这些操作是有问题的。这会导致长期占用连接,给数据库带来压力。
     
    4、重用Statement/PreparedStatement--对于一些预定义SQL,设置为静态常量,并尽可能重用预定义SQL产生的PreparedStatement对象。对于多次使用一种模式的SQL,使用预定义SQL可以获取更好的性能。对于Statement对象,可以反复的重用,每次都可以接收不同的SQL语句,而对于PreparedStatement则不可以,因为预定义SQL在定义PreparedStatement对象时候已经确定了,但是如果sql语句不变,则可以调用clearParameters()来达到从用目的,如果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、代码高层优化--在以上的基础上,优化封装你的数据访问方式,尽可能让代码简洁好维护,如果你还觉得性能不行,那就该从整个系统角度考虑优化了,比如加上缓存服务器,集群、负载均衡、优化数据库服务器等等,以获取更好的系能。
  • 相关阅读:
    element ui 表单清空
    element ui 覆盖样式 方法
    element ui 修改表单值 提交无效
    element ui 抽屉里的表单输入框无法修改值
    element ui 抽屉首次显示 闪烁
    css 左侧高度 跟随右侧内容高度 自适应
    PICNUF框架
    elementui 抽屉组件标题 出现黑色边框
    vue 子组件跨多层调用父组件中方法
    vue 编辑table 数据 未点击提交,table里的数据就发生了改变(深拷贝处理)
  • 原文地址:https://www.cnblogs.com/firstdream/p/7834945.html
Copyright © 2020-2023  润新知