• 中文
    • English
  • 注册
  • 赞助本站

    • 支付宝
    • 微信
    • QQ

    感谢一直支持本站的所有人!

    • 查看作者
    • 11:Druid

      一.  原方法

      首先使用之前的方法,计算一下创建100次链接耗时:

      public class Test {
          public static void main(String[] args) throws SQLException {
              JDBCUtils js = new JDBCUtils();
              long start = System.currentTimeMillis();
              for (int i = 0; i < 100; i++) {
                  Connection connection = js.getConnection();
                  System.out.println(connection);
                  connection.close();
      
              }
              long end = System.currentTimeMillis();
              System.out.println("花费时间为:" + (end - start));
          }
      }
      
      输出:
      oracle.jdbc.driver.T4CConnection@1b0375b3
      oracle.jdbc.driver.T4CConnection@2f7c7260
      oracle.jdbc.driver.T4CConnection@2d209079
      oracle.jdbc.driver.T4CConnection@6bdf28bb
      oracle.jdbc.driver.T4CConnection@6b71769e
      ......
      花费时间为:3176

      可以看到每个链接地址都不同,且耗时长

      二.  Druid

      再来看一下使用Druid后,创建1链接耗时:

      import com.alibaba.druid.pool.DruidDataSource;
      import com.alibaba.druid.pool.DruidPooledConnection;
      import com.oaec.day08.util.JDBCUtils;
      
      import java.sql.Connection;
      import java.sql.SQLException;
      
      
      public class Test {
        
          public static void main(String[] args) throws SQLException {
              DruidDataSource druidDataSource = new DruidDataSource();
              druidDataSource.setDriverClassName("oracle.jdbc.OracleDriver");
              druidDataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
              druidDataSource.setUsername("book");
              druidDataSource.setPassword("zhangjia");
              DruidPooledConnection connection = druidDataSource.getConnection();
              connection.close();//记得加上
              long start = System.currentTimeMillis();
              for (int i = 0; i < 100; i++) {
      
                  connection = druidDataSource.getConnection();
                  System.out.println("conn = " + connection);
                  connection.close();
              }
              long end = System.currentTimeMillis();
              System.out.println("花费时间为:" + (end - start));
          }
      }
      
      输出:
      connection = oracle.jdbc.driver.T4CConnection@6fe2ac7f
      conn = oracle.jdbc.driver.T4CConnection@6fe2ac7f
      conn = oracle.jdbc.driver.T4CConnection@6fe2ac7f
      conn = oracle.jdbc.driver.T4CConnection@6fe2ac7f
      ......
      花费时间为:29

      可以看到始终是一个链接,且耗时短

      三.  使用Druid优化之前的JDBCUtils

      首先来看一下优化之前的JDBCUtils:

      package com.oaec.day07.util;
      
      import java.sql.*;
      
      /**
       * JDBC的工具类,负责:加载驱动,建立连接,释放资源
       *
       */
      public class JDBCUtils {
      
      	private static final String DRIVER = "oracle.jdbc.OracleDriver";
      	private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
      	
      	private static final String USER = "book";
      	private static final String PASSWORD = "zhangjia";
      
      	static {
      		// 因为驱动只需要加载一次,所以在静态语句块中进行加载
      		try {
      			Class.forName(DRIVER);
      		} catch (ClassNotFoundException e) {
      			e.printStackTrace();
      		}
      	}
      
      	/**
      	 * 建立和数据库的连接
      	 * 
      	 * @return 连接
      	 */
      	public Connection getConnection() {
      		try {
      			Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
      			return connection;
      		} catch (SQLException e) {
      			e.printStackTrace();
      		}
      		return null;
      	}
      
      	/**
      	 * 释放资源
      	 * 
      	 * @param rs
      	 *            结果集
      	 * @param stm
      	 *            语句对象
      	 * @param conn
      	 *            连接
      	 */
      	public void close(ResultSet rs, Statement stm, Connection conn) {
      		try {
      			// 关闭结果集
      			if (rs != null && !rs.isClosed()) {
      				rs.close();
      			}
      		} catch (SQLException e) {
      			e.printStackTrace();
      		} finally {
      			try {
      				// 关闭语句对象
      				if (stm != null && !stm.isClosed()) {
      					stm.close();
      				}
      			} catch (SQLException e) {
      				e.printStackTrace();
      			} finally {
      				try {
      					// 关闭连接
      					if (conn != null && !conn.isClosed()) {
      						conn.close();
      					}
      				} catch (SQLException e) {
      					e.printStackTrace();
      				}
      			}
      		}
      	}
      
      	/**
      	 * 释放资源
      	 * 
      	 * @param stm
      	 *            语句对象
      	 * @param conn
      	 *            连接
      	 */
      	public void close(Statement stm, Connection conn) {
      		close(null, stm, conn);
      	}
      
      }

      既然有了Druid,我们JDBCUtils中的getConnection方法中的操作便可以使用Druid来替换,

      public class JDBCUtils {
      
      	/**
      	 * 建立和数据库的连接
      	 * 
      	 * @return 连接
      	 */
      	public Connection getConnection() {
      		try {
      			    DruidDataSource druidDataSource = new DruidDataSource();
                                  druidDataSource.setDriverClassName("oracle.jdbc.OracleDriver");
                                  druidDataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
                                  druidDataSource.setUsername("book");
                                  druidDataSource.setPassword("zhangjia");
                                  DruidPooledConnection conn=dataSource.getConnection();
      		} catch (SQLException e) {
      			e.printStackTrace();
      		}
      		return null;
      	}
      	....
      }

      但是这样会存在一个问题,因为我们每次获取链接的时候都会执行try中的代码,但是Druid在第一次建立连接的时候,因为要建立的是连接池,会非常的慢,所以上面的代码虽然用Druid替换了之前的代码,但是效率却降低了,所以我们需要想办法执行getConnection的时候,连接池只创建一次,也就是只需要一个DruidDataSource 对象,可以通过单例模式来解决:

      首先编写JDBCDataSource 类,用于返回一个DruidDataSource 对象

      public class JDBCDataSource {
          private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
          private static final String USERNAME = "book";
          private static final String PASSWORD = "zhangjia";
          private static DruidDataSource dataSource;
          //setDriverClassName可以不设置,当不设置驱动类名时,会根据url自动设置
          static {
              dataSource = new DruidDataSource();
              dataSource.setUrl(URL);
              dataSource.setUsername(USERNAME);
              dataSource.setPassword(PASSWORD);
          }
      
          public static DruidDataSource getDataSource() {
              return dataSource;
          }
      }

      接下来,直接在JDBCUtils里调用JDBCDataSource 类的dataSource对象即可。

      import com.oaec.day08.jdbc.JDBCDataSource;
      
      import java.sql.*;
      
      /**
       * JDBC的工具类,负责:加载驱动,建立连接,释放资源
       *
       */
      public class JDBCUtils {
      
      
         /**
          * 建立和数据库的连接
          * 
          * @return 连接
          */
         public Connection getConnection() {
            try {
               return JDBCDataSource.getDataSource().getConnection();
            } catch (SQLException e) {
               e.printStackTrace();
            }
            return null;
         }
      
         /**
          * 释放资源
          * 
          * @param rs
          *            结果集
          * @param stm
          *            语句对象
          * @param conn
          *            连接
          */
         public void close(ResultSet rs, Statement stm, Connection conn) {
            try {
               // 关闭结果集
               if (rs != null && !rs.isClosed()) {
                  rs.close();
               }
            } catch (SQLException e) {
               e.printStackTrace();
            } finally {
               try {
                  // 关闭语句对象
                  if (stm != null && !stm.isClosed()) {
                     stm.close();
                  }
               } catch (SQLException e) {
                  e.printStackTrace();
               } finally {
                  try {
                     // 关闭连接
                     if (conn != null && !conn.isClosed()) {
                        conn.close();
                     }
                  } catch (SQLException e) {
                     e.printStackTrace();
                  }
               }
            }
         }
      
         /**
          * 释放资源
          * 
          * @param stm
          *            语句对象
          * @param conn
          *            连接
          */
         public void close(Statement stm, Connection conn) {
            close(null, stm, conn);
         }
      
      }

      山东省
    • 0
    • 0
    • 0
    • 612
    • 请登录之后再进行评论

      登录
    • 做任务
    • 实时动态
    • 偏好设置
    • 返回顶部
    • 单栏布局 侧栏位置: