第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();
}
}
}
浙公网安备 33010602011771号