第3.30课 上课 JDBC深入介绍, 数据连接池

3_30

JDBC深入介绍

 数据连接池

  为什么要使用数据库连接池

JDBC可以连接数据库,但是JDBC只封装了一些CRUD语句,而真正和数据库联系的数据源,JDBC默认绑定的数据源是比较差的数据源

由于建立数据库连接是一个非常耗时耗资源的行为,

所以如果频繁进行数据库连接获取的时候效率是比较低下的。

  常用开源数据连接池有DBCP、C3P0

常用开源数据连接池有DBCP、C3P0;

 

Spring开发组推荐使用DBCP;

 

Hibernate开发组推荐使用C3P0;

 

dbcp没有自动回收空闲连接的功能

 

c3p0有自动回收空闲连接功能

 

 

  数据库连接池介绍

 

建立数据库连接是一个非常消耗资源的行为,如当有一个数据访问操作时,需要创建一个连接,当这次服务访问完成后,这个连接虽然已关闭但是还没有被销毁,这样会耗内存。当下次再有需要数据访问的操作时程序又会创建连接,如此以往既消耗时间,又要消耗资源。所以最后就使用了一种节省资源的方式,即数据库连接池的方式。

连接池是预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

 

 

 

 

 

 

 

 

 

  数据库连接池的工作原理

基本原理:

在数据库连接池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。外部使用者可通过getConnection 方法获取连接,使用完毕后再通过close方法将连接返回,注意此时连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。

 

 

  数据源

   DBCP数据源

DBCP(DataBase connection pool),数据库连接池。

是 apache 上的一个 java 连接池项目,因为tomcat服务器就是apache基金开发的所以Tomcat的数据源使用的就是DBCP。

 

 

使用 DBCP 需要用到 2 个包:

即 commons-dbcp.jar 、 commons-pool.jar

 

 

DBCP 的工作原理是,程序首先会初始化相应的数据库连接池,以供程序访问,当某个操作需要访问数据库时,程序会首先在连接池中取得空闲连接,如没有空闲连接在创建,用完之后归还连接池,这样达到了连接的重利用,不用频繁的创建连接和销毁,从而优化程序。

 

DBCP相关jar包下载地址:

http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

 

http://commons.apache.org/proper/commons-pool/download_pool.cgi

 

 

    JNDI技术介绍

1.JNDI,Java命名和目录接口,允许应用程序通过公共接口访问各种命名和目录服务。

2.和JDBC一样,JNDI也是一组接口,它允许应用程序使用一个标准化的API来访问许多不同的目录服务供应商。

3.JDK包含了JNDI接口,但不包括JNDI服务提供者 - 尽管Sun Microsystems公司提供的适配器,用于连接到现有的目录服务供应商。

4.Tomcat默认使用dbcp作为其连接池。

    创建DBCP数据源的步骤

 

项目路径结构:

 

 

 

 

driverClassName=com.mysql.jdbc.Driver 数据库驱动

url=jdbc:mysql://localhost:3306/test URL

username=root 数据库登录名

password=root 数据库密码

initialSize=10 初始化连接池大小

maxActive=50 最大活动数

maxIdle=20 最大保存数

minIdle=5 最大保存数

maxWait=60000    最长等待时间

 

 

 

 

 

 

 

 

 

 

 

    实例代码

 

import java.sql.Connection;

import java.sql.SQLException;

import java.io.InputStream;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSourceFactory;

/**

* 通过dbcp数据库连接池获取数据库连接

*/

public class DBCPDemo {

 

private static DataSource ds;

/**

* 静态块,只再程序加载的时候执行一次

*/

static {

try {

//读取属性文件

InputStream in = DBCPDemo.class.getClassLoader().getResourceAsStream("dbcp.properties");

Properties props = new Properties();

//装载到属性文件对象中

props.load(in);

//获取数据源

ds = BasicDataSourceFactory.createDataSource(props);

} catch (Exception e) {

e.printStackTrace();

}

}

 

/**

* 获取数据库连接方法

* @return Connection

*/

public static Connection getConnection() {

try {

return ds.getConnection();

} catch (SQLException e) {

e.printStackTrace();

}

return null;

}

 

/**

* 程序入口方法

*/

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

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

Connection conn = getConnection();

System.out.println(i+" 获取连接测试: "+conn);

conn.close();

}

}

}

posted on 2018-01-31 22:57  東風★破  阅读(112)  评论(0)    收藏  举报

导航