说明
一个Connection对象表示通过JDBC驱动与数据源建立的连接,这里的数据源可以是关系型数据库管理系统(DBMS)、文件系统(所以也可以通过Connection访问文件)或者其他通过JDBC驱动访问的数据
- 如何获取Connection对象:
- DriverManager
- DataSource
- Connection必须显示关闭
Connection关闭后,由该Connection对象创建的所有Statement对象都会被关闭 - 通过isClose关闭Connection
- 为了更好的兼容性,通过isValid关闭Connection
JDBC驱动类型
- JDBC-ODBC Bridge Driver
利用现成的ODBC架构将JDBC调用转换为ODBC调用,并非所有功能都能直接转换并正常调用,而多层调用转换对性能也有一定的影响 - Native API Driver
直接调用数据库提供的原生链接库或客户端,没有中间过程,访问速度通常表现良好,驱动程序与数据库和平台绑定无法达到JDBC跨平台的基本目的 - JDBC-Net Driver
将JDBC调用转换为独立于数据库的协议,然后通过特定的中间组件或服务器转换为数据库通信协议,主要目的是获得更好的架构灵活性,通过中间服务器转换会对性能有一定影响 - Native Protocol Driver
驱动程序把JDBC调用转换为数据库特定的网络通信协议
java.sql.Driver接口
所有的JDBC驱动都必须实现Driver接口,而且实现类必须包含一个静态初始化代码块(调用DriverManager的registerDriver方法)注册驱动
在使用Class.forName方法加载驱动时,驱动需要提供一个无参构造方法
注册方式:
- 驱动实现类静态代码块主动注册
- 在DriverManager类初始化时,会试图加载所有jdbc.drivers属性指定的驱动类,因此可以通过指定jdbc.drivers属性来注册驱动
1
java -Djdbc.drivers=xxx ExampleApplication
- Java的SPI机制加载驱动
必须存在一个META-INF/services/java.sql.Driver文件,在java.sql.Driver文件中必须指定Driver接口的实现类
Java SPI机制简介
当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services目录中创建一个以服务接口命名的文件,这个文件中的内容就是这个接口具体的实现类。当其他的程序需要这个服务的时候,就可以查找这个JAR包中META-INF/services目录的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名加载服务实现类,然后就可以使用该服务了
1 | ServiceLoader<Driver> drivers = ServiceLoader.load(java.sql.Driver.class); |
java.sql.DriverAction接口
JDBC驱动可以通过实现DriverAction接口来监听DriverManager类的deregisterDriver()方法的调用
java.sql.DriverManager类
DriverManager类通过Driver接口为JDBC客户端管理一组可用的驱动实现
javax.sql.DataSource接口
- 通过连接池提高系统性能和伸缩性
- 通过XADataSource接口支持分布式事务
DataSource接口的实现必须包含一个无参构造方法
JNDI
为应用程序提供了一种通过网络访问远程服务的方式,例如数据库配置放在tomcat的配置中,通过JNDI获取数据库连接
参考
- MyBatis 3源码深度解析/江荣波