一个Connection对象表示通过JDBC驱动与数据源建立的连接。使用JDBC API的应用程序可能需要维护多个Connection对象,一个Connection对象可能访问多个数据源,也可能访问单个数据源。
1. 获取Connection对象的方式
1. 获取Connection对象的方式
通过JDBC API 中提供的DriverManger 类获取。
通过DataSource接口的实现类获取。
2.驱动类型
开发过程中最常用的驱动类型 Native Protocol Driver。由数据库生产商提供,驱动程序把JDBC的调用转换为特定的网络通信协议。使用网络通信,驱动程序可以完全由JAVA编写,跨平台性良好,性能也好。(驱动类型的区分主要在于通讯协议、是否有中间层,其余不做介绍)
3.java.sql.Driver 接口
所有的JDBC驱动都必须实现Driver接口,并且在驱动的实现类中有一个静态的代码块,用于向DriverManager注册一个自己的实例。例如:halo驱动实现
package com.halo;import java.sql.DriverManager;import java.sql.SQLException;public class Driver implements java.sql.Driver {private static @Nullable Driver registeredDriver;private static final Logger PARENT_LOGGER = Logger.getLogger("com.halo");private static final Logger LOGGER = Logger.getLogger("com.halo.Driver");private static final SharedTimer SHARED_TIMER = new SharedTimer();private static final String DEFAULT_PORT = "1921";static {try {// moved the registerDriver from the constructor to here// because some clients call the driver themselves (I know, as// my early jdbc work did - and that was based on other examples).// Placing it here, means that the driver is registered once only.if (isRegistered()) {throw new IllegalStateException("Driver is already registered. It can only be registered once.");}Driver registeredDriver = new Driver();DriverManager.registerDriver(registeredDriver);Driver.registeredDriver = registeredDriver;} catch (SQLException e) {throw new ExceptionInInitializerError(e);}}}
当我们加载驱动实现类时,静态块就会被调用,向JDBCManager中注册一个驱动类的实现,这就是我们为什么在使用驱动时需要显示的加载驱动,例如:
Class.forName("com.halo.Driver");当我们使用驱动获取数据库连接时,DriverManager会调用Driver接口提供的connect方法,具体的实现由驱动提供。连接成功后会返回Connection对象。
在JDBC 4.0 以上的版本对getConnection()方法做了增强,可以通过java的SPI 机制加载驱动。符合JDBC 4.0 以上版本的驱动会在jar存在META-INF/service/java.sql.Driver 文件,文件中指定了Driver接口的实现类。例如:halo
com.halo.Driver
SPI(Service Provider Interface) 是JDK提供的一种服务提供发现机制。SPI是一种动态替换发现的机制。可以查阅JDK中的java.util.ServiceLoader 。
4. 关闭Connection对象
使用完connection对象之后,需要显式的关闭该对象。Connection接口中提供了close()方法用来关闭连接,还提供了isClosed()方法用来检测连接是否关闭;同时还提供了isValid()方法判断连接是否有效。
需要注意的是,isClosed()方法返回只能用来判断应用是否调用了close()方法,不能够用来判断连接是否有效。isValid()方法用来判断连接是否有效,当返回false时,除了close(),isClose(),isValid()方法外,调用其余方法均会报错。




