暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Java如何调用Halo数据库(二)-Connection接口

原创 贾桂军 2023-10-19
15024

一个Connection对象表示通过JDBC驱动与数据源建立的连接。使用JDBC API的应用程序可能需要维护多个Connection对象,一个Connection对象可能访问多个数据源,也可能访问单个数据源。

1. 获取Connection对象的方式
1. 获取Connection对象的方式
  1. 通过JDBC API 中提供的DriverManger 类获取。

  2. 通过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()方法外,调用其余方法均会报错。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论