JDBC 数据库连接池

JDBC 数据库连接池:
 1. 必要性:
 1) 再使用开发基于数据库的 web 程序时,传统的模式基本是按以下步骤:
  -在主程序中建立数据库连接
  -进行 sql 操作
  -断开数据库连接

 这种模式开发,存在的问题:
  ①普通的 JDBC 数据库连接使用 DriverManager 来获取,每次向数据库建立连接 的时候都要将 Connection 加载到内存中,在验证用户名和密码(得花费 0.05~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完后在断开连接。这样的方式将会消耗大量的 资源和时间。数据库的连接资源并没有得到很好的重复利用。若同时又几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

 ②对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄露,最终将导致重启数据库。

③这种开发不能控制被创建的连接对象数,系统资源会被毫无顾忌的分配出去。如连接过多,也可能导致内存泄露,服务器崩溃。

 2. 数据库连接池的基本思想:为数据库连接建立一个“缓冲池”。 预先在缓冲池中放入一定数量的连接, 当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕之后再放回去。

 3. 数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

/**
  * 1. 加载Properties 配置文件:配置文件中的键需要来自 BasicDataSource 的属性
  * 2. 调用 BasicDataSourceFactory 的 createDataSource 方法创建 DataSource实例
  * 3. 从 DataSource 实例中获取数据库连接
  * @throws Exception
  */
 @Test
 public void testDBCPWithDataSourceFactory() throws Exception{
  
  Properties properties = new Properties();
  InputStream inStream = testBatch.class.getClassLoader()
    .getResourceAsStream("dbcp.properties");
  properties.load(inStream);
  javax.sql.DataSource dataSource =
    BasicDataSourceFactory.createDataSource(properties);
  
  System.out.println(dataSource.getConnection());
  BasicDataSource basicDataSource = (BasicDataSource) dataSource;
  System.out.println(basicDataSource.getMaxWait());
  
 }
 
 /**
  * 使用 DBCP 数据库连接池
  * 1. 加入 jar 包(两个 jar 包)。 依赖于 Commons Pool
  * 2. 创建数据库连接池
  * 3. 为数据源实例指定必须的属性
  * 4. 从数据源中获取数据库连接
  * @throws Exception
  */
 @Test
 public void testDBCP() throws Exception{
  BasicDataSource dataSource = null;
  //1.创建 DBPC 数据源实例
  dataSource =  new BasicDataSource();
  //2.为数据源实例指定必须的属性
  dataSource.setUsername("root");
  dataSource.setPassword("root");
  dataSource.setUrl("jdbc:mysql:///mydata");
  dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  //3. 指定数据源的一些可选的属性
  //1). 指定数据库连接池中初始化连接数的个数
  dataSource.setInitialSize(10);
  //2). 指定最大的连接数:同一时刻可以同时向数据库申请的连接数
  dataSource.setMaxActive(50);
  //3). 指定最小连接数:在数据库连接池中保存的最少的空闲连接的数量
  dataSource.setMinIdle(5);
  //4). 等待数据库连接池分配连接的最长时间。单位为毫秒。超出该时间将抛出异常
  dataSource.setMaxWait(1000 * 5);
  
  //4.从数据源中获取数据库连接
  Connection connection = dataSource.getConnection();
  System.out.println(connection.getClass());
 }  
 

dbcp.properties

username=root
password=root
url=jdbc:mysql:///mydata
driverClassName=com.mysql.jdbc.Driver

initialSize=10
maxActive=50
minIdle=5
maxWait=5000

转载于:https://my.oschina.net/u/2260265/blog/348718

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值