如何通过 registerDriver() 方法加载 type-2 JDBC 驱动程序?

Posted

技术标签:

【中文标题】如何通过 registerDriver() 方法加载 type-2 JDBC 驱动程序?【英文标题】:How to load type-2 JDBC driver by registerDriver( ) method? 【发布时间】:2018-05-20 05:53:52 【问题描述】:

我正在尝试通过registerDriver(); 方法加载 Type-2(Native API) 驱动程序。但它说 OracleDataSource 不能转换为驱动程序。

 import java.sql.DriverManager;
    import java.sql.SQLException;

    import java.util.Enumeration;
    public class Driver2_Load2 
    
        public static void main(String[] args) throws SQLException
        
            oracle.jdbc.pool.OracleDataSource d = new oracle.jdbc.pool.OracleDataSource();
            DriverManager.registerDriver(d);

            Enumeration e = DriverManager.getDrivers();
            if(e.hasMoreElements())
            
                System.out.println(e.nextElement());
            
        

然后我尝试了类型转换:-

oracle.jdbc.pool.OracleDataSource d = new oracle.jdbc.pool.OracleDataSource();
DriverManager.registerDriver((Driver) d);

但它会抛出异常,java.lang.ClassCastException: oracle.jdbc.pool.OracleDataSource cannot be cast to java.sql.Driver

运行:-

set classpath=;D:\ORACLE-11g\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar;
javac Driver2_Load2.java
java Driver2_Load2

【问题讨论】:

【参考方案1】:

加载类型 2 驱动程序与加载类型 4 驱动程序没有什么不同,因为实际的驱动程序类总是相同的。类型 2 驱动还需要安装完整的 Oracle 客户端(与类型 4 驱动相反,类型 4 驱动只需要 .jar 文件)

对于任何现代 Java 和驱动程序版本,都无需调用 registerDriver()class.forName()。您需要做的就是提供一个使用oci 协议而不是thin 协议的连接URL。

As documented in the manual 使用驱动程序协议建立 OCI 连接oci: jdbc:oracle:oci:...

所以要创建一个 OCI 连接,你需要在 URL 中指定:

DriverManager.getConnection("jdbc:oracle:oci:@//localhost:1521/orcl", "hr", "hr");

但您必须安装 Oracle 客户端,包括所有需要的 DLL 并为您的 JVM 提供,但无需调用 registerDriver()(或 Class.forName()


关于您的代码:oracle.jdbc.pool.OracleDataSource 是 - 正如类名所示 - javax.sql.DataSource 的实现,它不是 javax.sql.Driver

registerDriver() 需要 java.sql.Driver 的类名,而不是 DataSource

Oracle 驱动程序类是oracle.jdbc.OracleDriver


无关,但是:为什么您认为首先需要 OCI 驱动程序? Oracle recommends 使用瘦驱动程序,除非您有非常具体的要求,例如您需要在 RAC 环境中使用“透明应用程序故障转移”。

【讨论】:

更强大的是,应用程序代码应该永远调用DriverManager.registerDriver;它只能由 JDBC 驱动程序本身调用(忽略非注册驱动程序的某些边缘情况)。【参考方案2】:

见https://docs.oracle.com/cd/F49540_01/DOC/java.815/a64685/basic1.htm,语法为:

DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); 

【讨论】:

这是为type-2驱动还是type-4驱动? 应用程序代码不应该调用DriverManager.registerDriver。该文档(顺便说一句是针对 Oracle 8.1,所以不是最新的)是公然错误的。

以上是关于如何通过 registerDriver() 方法加载 type-2 JDBC 驱动程序?的主要内容,如果未能解决你的问题,请参考以下文章

JDBC Class.forName 与 DriverManager.registerDriver

Class.forName和registerDriver的区别

jdbc加载驱动方法

JDBC

jdbc操作数据库

关于Java的jdbc中 DriverManager.registerDriver(driver); //注册驱动 有没有必要写的思考