zoukankan      html  css  js  c++  java
  • java提高数据库访问效率代码优化

    package com.jb.jubmis.comm;

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;

    import org.apache.commons.dbcp.BasicDataSource;

    /**
     * 使用abcp连接池
     * @author admin
     *所需JAR包:commons-pool-1.6.jar、commons-collections-3.2.1.jar、commons-dbcp-1.4.jar
     *
     */
    public class DBCPDataSourceUtils {

    // private static final String DRIVER_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
     private static final int INITIAL = 50;//初始化50个连接
     private static final int MAX_ACTIVE = 500;//最大值500个连接
     private static final int MAX_IDLE = 10;//最大空闲10
     private static final long MAX_WAIT = 2 * 1000;//超过500个访问,等待的时间
     private static final String DRIVER_NAME = "org.sqlite.JDBC";//数据库jar驱动,我这里是使用的的sqlite测试
     private static BasicDataSource bds;
     static{
      if(bds == null){
       bds = new BasicDataSource();
      }
      bds.setDriverClassName(DRIVER_NAME);
      bds.setInitialSize(INITIAL);
      bds.setMaxActive(MAX_ACTIVE);
      bds.setMaxIdle(MAX_IDLE);
      bds.setMaxWait(MAX_WAIT);

      //注意这样设置事物自动提交的方式为false效率高但是要手动提交否则提交不了事物,如果不设置默认为true
      bds.setDefaultAutoCommit(false);
     }
     
     /**
      * 打开连接池
      * @param path 数据库的路径
      * @return
      * @throws SQLException
      */
     public static Connection getSqliteConnection(String path) throws SQLException{
      bds.setUrl("jdbc:sqlite:" + path);//数据库的路径, 我这里是使用的的sqlite测试
      //bds.setUsername("");//数据库用户
      //bds.setPassword("");//数据库密码
      return bds.getConnection();
     }

     /**
      * 释放数据库连接
      *
      * @param rs
      * @param st
      * @param conn
      */
     public static void freeConnection(ResultSet rs, Statement st,
       Connection conn) {
      try {
       if (rs != null)
        rs.close();
      } catch (SQLException e) {
       e.printStackTrace();
      } finally {
       try {
        if (st != null)
         st.close();
       } catch (SQLException e) {
        e.printStackTrace();
       } finally {
        if (conn != null)
         try {
          conn.close();
         } catch (SQLException e) {
          e.printStackTrace();
         }
       }
      }
     }
    }

    =========================daoimpl========================================================

    public void saveInfos(List<ContactHistorys> contactHistory)
       throws SQLException {
      Connection conn = null;
      PreparedStatement stat = null;
      try {
       if (contactHistory.size() > 0) {

        conn = DBCPDataSourceUtils.getSqliteConnection(path);//使用的是dbcp连接池
        conn.setAutoCommit(false);// 设置不自动提交的事物,效率高
        String sql = " insert into xskh_touch "
          + "(aguid,pguid,status,pxxh,remark,lastupdate,guid_kind,guid_style,guid_kh,guid_work,date_work)"
          + "values(?,?,?,?,?,?,?,?,?,?,?)";
        stat = conn.prepareStatement(sql);
        for (ContactHistorys contactHistorys : contactHistory) {

         stat.setString(1, contactHistorys.getId());
         stat.setString(2, contactHistorys.getPid());
         stat.setInt(3, contactHistorys.getStatus());
         stat.setInt(4, contactHistorys.getSerialNum());
         stat.setString(5, contactHistorys.getRemark());
         stat.setString(6, contactHistorys.getTheLastOfUpdate());
         stat.setString(7, contactHistorys.getGuid_kind());
         stat.setString(8, contactHistorys.getGuid_style());
         stat.setString(9, contactHistorys.getGuid_kh());
         stat.setString(10, contactHistorys.getUser());
         stat.setString(11, contactHistorys.getTimeOfContact());

        // stat.addBatch();
        stat.execute();
        }
        //stat.executeBatch();//批量提交
        
        //手动提交事物,如果使用jdbc一般不会报错(注意:如果报错”Auto-Commit Mode“,则需要在连接池中设置提交事物的方式为false)
        conn.commit();
        
       }
      } catch (Exception e) {
       e.printStackTrace();
       conn.rollback();
      } finally {
       DBCPDataSourceUtils.freeConnection(null, stat, conn);
      }
     }

     =============================提高数据库访问效率代码优化==================、

     JDBC最佳实践1:使用PreparedStatement 
    任何一个使用过JDBC的Java程序员几乎都知道这个,PreparedStatement可以通过预编译的方式避免我们在拼接SQL时造成SQL注入。 
    2
    JDBC最佳实践2、使用ConnectionPool(连接池) 
    使用连接池作为最佳实践几乎都成了公认的标准。一些框架已经提供了内建的连接池支持,例如Spring中的Database Connection Pool,如果你的应用部署在JavaEE的应用服务器中,例如JBoss,WAS,这些服务器也会有内建的连接池支持,例如DBCP。使用连接的原因简单的说就是因为创建JDBC连接耗时比较长,如果每次查询都重新打开一个连接,然后关闭,性能将会非常低,而如果事先创建好一批连接缓存起来,使用的时候取出,不使用的时候仍不关闭,将会节省大量的创建关闭连接的时间。
    3
    JDBC最佳实践3、禁用自动提交 
    这个最佳实践在我们使用JDBC的批量提交的时候显得非常有用,将自动提交禁用后,你可以将一组数据库操作放在一个事务中,而自动提交模式每次执行SQL语句都将执行自己的事务,并且在执行结束提交。
    4
    JDBC最佳实践4、使用Batch Update 
    JDBC的API提供了通过addBatch()方法向batch中添加SQL查询,然后通过executeBatch()执行批量的查询。JDBC batch update可以减少数据库数据传输的往返次数,从而提高性能。
    5
    JDBC最佳实践5:使用列名获取ResultSet中的数据,从而避免invalidColumIndexError 
    JDBC中的查询结果封装在ResultSet中,我们可以通过列名和列序号两种方式获取查询的数据,当我们传入的列序号不正确的时候,就会抛出invalidColumIndexException,例如你传入了0,就会出错,因为ResultSet中的列序号是从1开始的。另外,如果你更改了数据表中列的顺序,你也不必更改JDBC代码,保持了程序的健壮性。有一些Java程序员可能会说通过序号访问列要比列名访问快一些,确实是这样,但是为了程序的健壮性、可读性,我还是更推荐你使用列名来访问。 
    6
    JDBC最佳实践6:使用变量绑定而不是字符串拼接 
    在第一条最佳实践中,我们已经说过要使用PreparedStatment可以防止注入,而使用?或者其他占位符也会提升性能,因为这样数据库就可以使用不同的参数执行相同的查询,这个最佳实践带来更高的性能的同时也防止了SQL注入。 
    7
    JDBC最佳实践7:要记住关闭Statement、PreparedStatement和Connection 
    通常的做法是在finally块中关闭它们,这样做的好处是不论语句执行正确与否,不管是否有异常抛出,都能保证资源被释放。在Java 7中,可以通过Automatic Resource Management Block来自动的关闭资源

    JDBC最佳实践8:选择合适的JDBC驱动 
    有四种JDBC驱动,分别是 
    第一种JDBC驱动叫做JDBC-ODBC Bridge driver (bridge driver) 
    第二种JDBC驱动叫做Native-API/partly Java driver (native driver) 
    第三种JDBC驱动叫做AllJava/Net-protocol driver (middleware driver) 
    第四种JDBC驱动叫做All Java/Native-protocol driver (Pure java driver) 
    9
    JDBC最佳实践9:尽量使用标准的SQL语句,从而在某种程度上避免数据库对SQL支持的差异  不同的数据库厂商的数据库产品支持的SQL的语法会有一定的出入,为了方便移植,我推荐使用标准的ANSI SQL标准写SQL语句。
    10
    JDBC最佳实践10:使用正确的getXXX()方法 
    当从ResultSet中读取数据的时候,虽然JDBC允许你使用getString()和getObject()方法获取任何数据类型,推荐使用正确的getter方法,这样可以避免数据类型转换。


    参考资料
    http://www.sctarena.com/Article/Article.asp?nid=3531

  • 相关阅读:
    sabaki and leelazero
    apply current folder view to all folders
    string operation in powershell
    wirte function in powershell
    add environment path to powershell
    Module in powershell
    sql prompt
    vmware中鼠标在部分区域不能使用
    调整多个控件的dock的顺序
    行为型模型 策略模式
  • 原文地址:https://www.cnblogs.com/qgc88/p/3345529.html
Copyright © 2011-2022 走看看