如何通过 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的区别
关于Java的jdbc中 DriverManager.registerDriver(driver); //注册驱动 有没有必要写的思考