• 1
  • 2
  • 3
  • 4
  • 5
mssql数据库问题 首 页  »  帮助中心  »  数据库  »  mssql数据库问题
数据库连接池的理解与使用
发布日期:2016-4-24 16:4:15

  数据库连接池的理解与使用

    一、什么是数据库连接池?

  官方的解释:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并且将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用与释放。

  个人的理解:创建数据库连接其实是一个很耗时的操作,也容易对数据库造成安全隐患。因此,在程序初始化的时候,集中创建多个数据库连接,并且把他们集中管理,供程序使用,就能保证较快的数据库读写速度,还更加安全可靠。

  二、数据库连接池的运行机制

  1.   程序初始化时创建连接池
  2.   使用时向连接池申请可用连接
  3.   使用完毕,将连接返还给连接池
  4.   程序退出时,断开所有连接,并释放资源

  

图1

  三、数据库连接池的使用

  作为开源的数据库连接池,C3P0不仅是一个优秀的连接池,性能也十分可靠。

  首先到http://sourceforge.net/projects/c3p0/网站下载相应的jar包,总共有三个,如图2所示。

  

图2

  然后将jar包导入到工程当中,然后就可以使用cp30了。

  代码已给出,如下所示:

    [java] view plain copypackage com.zww.server;

  import java.beans.PropertyVetoException;

  import java.sql.Connection;

  import java.sql.SQLException;

  import com.mchange.v2.c3p0.ComboPooledDataSource;

  public final class ConnectionManager {

  //使用单利模式创建数据库连接池

  private static ConnectionManager instance;

  private static ComboPooledDataSource dataSource;

  private ConnectionManager() throws SQLException, PropertyVetoException {

  dataSource = new ComboPooledDataSource();

  dataSource.setUser("root"); //用户名

  dataSource.setPassword("123456"); //密码

  dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zww");//数据库地址

  dataSource.setDriverClass("com.mysql.jdbc.Driver");

  dataSource.setInitialPoolSize(5); //初始化连接数

  dataSource.setMinPoolSize(1);//最小连接数

  dataSource.setMaxPoolSize(10);//最大连接数

  dataSource.setMaxStatements(50);//最长等待时间

  dataSource.setMaxIdleTime(60);//最大空闲时间,单位毫秒

  }

  public static final ConnectionManager getInstance() {

  if (instance == null) {

  try {

  instance = new ConnectionManager();

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  return instance;

  }

  public synchronized final Connection getConnection() {

  Connection conn = null;

  try {

  conn = dataSource.getConnection();

  } catch (SQLException e) {

  e.printStackTrace();

  }

  return conn;

  }

  }

  如下面所示的测试代码:

  [java] view plain copypackage com.zww.server;

  import java.sql.Connection;

  import java.sql.PreparedStatement;

  import java.sql.ResultSet;

  import java.sql.SQLException;

  import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

  public class ConnectionDemo {

  public static void main(String[] args) throws SQLException {

  System.out.println("使用连接池................................");

  for (int i = 0; i < 20; i++) {

  long beginTime = System.currentTimeMillis();

  Connection conn = ConnectionManager.getInstance().getConnection();

  try {

  PreparedStatement pstmt = conn.prepareStatement("select * from event");

  ResultSet rs = pstmt.executeQuery();

  while (rs.next()) {

  // do nothing...

  }

  } catch (SQLException e) {

  e.printStackTrace();

  } finally {

  try {

  conn.close();

  } catch (SQLException e) {

  e.printStackTrace();

  }

  }

  long endTime = System.currentTimeMillis();

  System.out.println("第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime));

  }

  System.out.println("不使用连接池................................");

  for (int i = 0; i < 20; i++) {

  long beginTime = System.currentTimeMillis();

  MysqlDataSource mds = new MysqlDataSource();

  mds.setURL("jdbc:mysql://localhost:3306/zww");

  mds.setUser("root");

  mds.setPassword("123456");

  Connection conn = mds.getConnection();

  try {

  PreparedStatement pstmt = conn.prepareStatement("select * from event");

  ResultSet rs = pstmt.executeQuery();

  while (rs.next()) {

  // do nothing...

  }

  } catch (SQLException e) {

  e.printStackTrace();

  } finally {

  try {

  conn.close();

  } catch (SQLException e) {

  e.printStackTrace();

  }

  }

  long endTime = System.currentTimeMillis();

  System.out.println("第" + (i + 1) + "次执行花费时间为:"

  + (endTime - beginTime));

  }

  }

  运行结果如图3所示:

  

图3
 

  图3所示的测试结果表明,在使用连接池时,只在第一次初始化时是比较耗时,在完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

以后会更新一些mssql的文,想学mssql的敬请关注