数据源和连接池的关系

Java JDBC 中的 java.sql.Driver 是数据库连接接口,由数据库厂商实现,如 Mysql 的 com.mysql.jdbc.Driver。java.sql.DriverManager 是管理 Driver 的接口,通过它获取数据库连接。javax.sql.DataSource,即数据源,是数据库连接的替代,包含连接池和管理,从连接池获取连接以减少资源消耗。常见的连接池技术有 DBCP、C3P0、druid 和 HikariCP。数据源通过连接池提供服务,实现了与数据库连接的解耦和服务增强。

Java JDBC 提供了 java.sql.Driver、java.sql.DriverManager、javax.sql.DataSource 三个接口,另外还有不同类型的连接池技术,它们之间的关系是什么?下面就简单说一下。

java.sql.Driver:是 Java 提供的一个用来连接数据库的驱动接口,具体实现由各数据库厂商完成。常见的实现有:Mysql 的实现 com.mysql.jdbc.Driver。是真正获取数据库连接 Connection 的接口(类) 。

package java.sql;

public interface Driver {
    
        Connection connect(String url, java.util.Properties info) throws SQLException;
        
        ...
} 

java.sql.DriverManager:是 Java 提供的数据库驱动管理器,用来管理 java.sql.Driver 接口的实现。一般都是通过调用该接口的 getConnection() 或者其重载的方法来获取数据库连接。其底层也是通过调用 java.sql.Driver 接口的 connect() 方法来获取连接。

package java.sql;

public class DriverManager {
    
    //用来存放所有注册的驱动集合
    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
     
     //  Worker method called by the public getConnection() methods.
    private static Connection getConnection(
        String url, java.util.Properties info, Class<?> caller) throws SQLException {
        ...

        for(DriverInfo aDriver : registeredDrivers) {
            // If the caller does not have permission to load the driver then
            // skip it.
            if(isDriverAllowed(aDriver.driver, callerCL)) {
                try {
                    println("    trying " + aDriver.driver.getClass().getName());
                    Connection con = aDriver.driver.connect(url, info);
                    if (con != null) {
                        // Success!
                        println("getConnection returning " + aDriver.driver.getClass().getName());
                        return (con);
                    }
                } catch (SQLException ex) {
                    if (reason == null) {
                        reason = ex;
                    }
                }
            } else {
                println("    skipping: " + aDriver.getClass().getName());
            }
        }
        ...
    }
    ...
}

javax.sql.DataSource:通常被称作数据源,也可以获取数据库连接,是用来代替 javax.sql.DriverManager 接口的。它包含连接池和连接池管理两个部分,可以从连接池中获取连接。

  • DriverManager用于管理驱动程序并且提供数据库的直连,频繁的创建和消耗连接增加系统大量开销,并且将数据库连接直接暴露。
  • 数据源的概念就是为了在应用程序和DriverManager创建的数据库直接连接之间插入一个中间层,借助于中间层,应用程序与数据库的连接两者之间完成了解耦,也能够对数据库的真实连接进行隐藏;一旦解耦,通过中间层间接调用,类似代理模式,就可以添加更多的服务---连接池以及分布式事务。
package javax.sql;
...
public interface DataSource  extends CommonDataSource, Wrapper {
    
      Connection getConnection() throws SQLException;
      
      Connection getConnection(String username, String password)  throws SQLException;

}

连接池:就是一个存放数据库连接的容器(集合)。它对JDBC的API 进行了包装,获取连接时可以从池中获取,使用完成后不是真正的 close,而是放回池中。常见的连接池技术有:DBCP ,C3P0 ,druid、HikariCP。

 

参考地址:

Data Source与数据库连接池简介 JDBC简介(八):https://www.cnblogs.com/noteless/p/10319296.html#

数据源和连接池的区别:http://www.doc88.com/p-7983312769263.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值