常用数据库连接池的区别与配置
数据库连接池的必要性
数据库连接是稀缺的、昂贵的资源,一个数据库连接对象对应一个物理数据库的连接,如果每次数据库操作都创建新的连接,使用完后释放,会导致系统性能低下,这就引出了连接池的概念。
数据库连接池,其实是一个容器(集合),用于存放数据库连接。当系统初始化结束后,连接池被创建,并初始化一定数据的连接对象到连接池中。当用户访问数据库时,从池中获取连接对象,用户访问完后,将连接对象归还到连接池中。
数据库连接池采用了资源池设计模式,用于资源共享,避免资源的频繁分配与释放问题。同时便于统一管理,可以通过对连接池的控制,限制系统与数据库的连接,监视数据库的连接数量和使用情况。
数据库连接池规范
DataSource接口是SUN公司制定的获取数据库连接的接口规范,位于javax.sql jar包中,可以代替DriverManager获取连接对象。DriverManager是SUN 公司提供的具体类,类中提供了注册驱动、获取连接的基本实现方法。DataSource是接口,接口的具体实现由数据库厂商来实现。
接口注释
该接口是DataSource对象所表示物理数据源的连接工厂。相较于DriverManager,DataSource是获取连接首选方案。实现DataSource接口的对象通常基于JNDI API注册命名服务。
DataSource 接口由驱动程序供应商实现。共有三种类型的实现:
- 基本实现 - 生成标准的 Connection 对象
- 连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。
- 分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。
通过DataSource对象访问的驱动程序本身不需要额外向DriverManager注册,并且通过DataSource对象获取到的连接与使用DriverManager获取到的连接是相同的。以druid连接池对象druidDataSource为例,DruidDataSource类中的getConnection()方法,内部调用init()方法,再进一步深入,我们在DruidDriver驱动注册方法中中发现了熟悉的代码。
DruidDriver.registerDriver(DruidDriver.instance);
public static synchronized void registerDriver(java.sql.Driver driver)
throws SQLException {
registerDriver(driver, null);
}
DataSource具体实现对象的属性可以任意修改。仍然以druid为例。我们只需要对资源文件修改即可变更数据源,无需修改任何访问数据源的代码。
Properties properties = new Properties();
properties.load(DruidUtil.class.getResourceAsStream("druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
接口分析
接口中仅有两个方法,均表示获取与DataSource对象所表示数据源的连接。
public interface DataSource extends CommonDataSource, Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password) throws SQLException;
}
了解常用数据库连接池
c3p0连接池
c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
配置文件默认为classpath下的c3p0.properties或c3p0-config.xml,核心数据库对象是ComboPooledDataSource。
dbcp连接池
DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP。
druid连接池
阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。
druid的配置文件为properties形式,可以为任意名称,放在任意目录下。可以通过Properties加载配置文件,通过DruidDataSourceFactory工厂获取DataSource对象。
三种连接池的属性配置参考
关于三种数据库连接池的详细配置可以参考:
https://www.cnblogs.com/JavaSubin/p/5294721.html
希望文章对您有所帮助,欢迎点赞关注:)