数据库连接池
什么是数据库连接池?
在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在java程序与数据库之间建立链接时,数据库端要验证用户名和密码,并且要为这个链接分配资源,java程序则要把代表链接的java.sql.Connection对象等加载到内存中,所以建立数据库链接的开销很大,尤其是在大量的并发访问时,假如某网站一天的访问量是10万,那么该网站的服务器就需要创建、断开链接10万次,频繁地创建和断开数据库链接势必会影响到数据库的访问效率,甚至可能会导致数据库崩溃。
为了避免频繁地创建数据库链接,程序员们提出了数据库连接池技术。数据库连接池负责分配、管理和释放数据库链接,它允许应用程序重复使用现有的数据库链接,而不是重新建立
图例:
图解:
从图可以看出,数据库连接池在初始化时将创建一定数量的数据库链接放到连接池中,当应用从程序访问数据库时并不是直接创建Connection,而是向连接池中”申请”一个Connection,如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。使用完毕后,连接池会将该Connection回收。并交付给其他的线程使用,以减少创建和断开数据库链接的次数,提高数据库的访问效率。
DBCP数据源
DBCP是数据库连接池(DataBase Connection Pool)的简称,是Apache组织下的开源连接池实现,也是Tomcat服务器使用的连接池组件,单独使用DBCP数据源时,需要在应用程序中导入两个jar包
实例代码:
代码:
public class testDemo {
/*
* BasicDataSource类 使用BasicDataSource类创建一个数据源对象,手动给数据源对象设置属性值,然后 获取连接对象。
*/
public static DataSource ds = null;
static {
// 获取DBCP数据源实现类对象
BasicDataSource bds = new BasicDataSource();
// 设置连接数据库需要的配置信息
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/demo");
bds.setUsername("root");
bds.setPassword("123456");
// 设置连接池参数 设置数据库连接池初始化的链接数目
bds.setInitialSize(5);
// 设置数据库连接池最大活跃的链接数目
bds.setMaxActive(5);
ds = bds;
}
public static void main(String[] args) throws SQLException {
// 获取数据库链接对象
Connection conn = ds.getConnection();
// 获取数据库链接信息
DatabaseMetaData metaData = conn.getMetaData();
// 打印数据库链接信息
System.out.println(metaData.getURL());
}
}
C3P0数据源
C3P0是目前最流行的开源数据库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和Spring使用的都是该数据源。在使用C3P0数据源开发时,需要了解C3P0中DataSource接口的实现类ComboPooledDataSource,它是C3P0的核心类,提供了数据源对象的相关方法
实例代码:
public class testDemo3 {
public static DataSource ds = null;
static {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/demo");
cpds.setUser("root");
cpds.setPassword("123456");
cpds.setInitialPoolSize(5);
cpds.setMaxPoolSize(5);
ds = cpds;
} catch (Exception e) {
// TODO: handle exception
throw new ExceptionInInitializerError(e);
}
}
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
System.out.println(ds.getConnection());
}
}