快捷搜索:

全面解析JDBC(三)

JDBC驱动治理黑幕是怎么样的?

DriverManager 类是 JDBC 的治理层,感化于用户和驱动法度榜样之间。它跟踪可用的驱动法度榜样,并在数据库和响应驱动法度榜样之间建立连接。别的,DriverManager类也处置惩罚诸如驱动法度榜样登录光阴限定及登录和跟踪消息的显示等事务。

对付简单的利用法度榜样,一样平常法度榜样员必要在此类中直接应用的独一措施是DriverManager.getConnection。正如名称所示,该措施将建立与数据库的连接。JDBC容许用户调用DriverManager的措施getDriver、getDrivers和registerDriver及Driver的措施connect。但多半环境下,让DriverManager类治理建立连接的细节为上策。

1. 跟踪可用驱动法度榜样

DriverManager类包孕一列Driver类,它们已经由过程调用措施DriverManager.registerDriver对自己进行了注册。所有Driver类都必须包孕有一个静态部分。它创建该类的实例,然后在加载该实例时DriverManager类进行注册。这样,用户正常环境下将不会直接调用DriverManager.registerDriver;而是在加载驱动法度榜样时由驱动法度榜样自动调用。加载Driver类,然后自动在DriverManager中注册的要领有两种:

(1)调用措施Class.forName

这将显式地加载驱动法度榜样类。因为这与外部设置无关,是以保举应用这种加载驱动法度榜样的措施。以下代码加载类acme.db.Driver:Class.forName("acme.db.Driver")。

假如将acme.db.Driver编写为加载时创建实例,并调用以该实例为参数的DriverManager.registerDriver(本该如斯),则它在DriverManager的驱动法度榜样列表中,并可用于创建连接。

(2)将驱动法度榜样添加到Java.lang.System的属性jdbc.drivers中

这是一个由DriverManager类加载的驱动法度榜样类名的列表,由冒号分隔:初始化DriverManager类时,它搜索系统属性jdbc.drivers,假如用户已输入了一个或多个驱动法度榜样,则DriverManager类将试图加载它们。以下代码阐明法度榜样员若何在~/.hotJava/properties中输入三个驱动法度榜样类(启动时,HotJava将把它加载到系统属性列表中):

jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver;

对DriverManager措施的第一次调用将自动加载这些驱动法度榜样类。留意:加载驱动法度榜样的第二种措施必要持久的预设情况。假如对这一点不能包管,则调用措施Class.forName显式地加载每个驱动法度榜样就显得更为安然。这也是引入特定驱动法度榜样的措施,由于一旦DriverManager类被初始化,它将不再反省jdbc.drivers属性列表。

在以上两种环境中,新加载的Driver类都要经由过程调用DriverManager.registerDriver类进行自我注册。如上所述,加载类时将自动履行这一历程。

因为安然方面的缘故原由,JDBC治理层将跟踪哪个类加载器供给哪个驱动法度榜样。这样,当DriverManager类打开连接时,它仅应用本地文件系统或与发出连接哀求的代码相同的类加载器供给的驱动法度榜样。

2. 建立连接

加载Driver类并在DriverManager类中注册后,它们即可用来与数据库建立连接。当调用DriverManager.getConnection措施发出连接哀求时,DriverManager将反省每个驱动法度榜样,查看它是否可以建立连接。

无意偶尔可能有多个JDBC驱动法度榜样可以与给定的URL连接。例如,与给定远程数据库连接时,可以应用JDBC-ODBC桥驱动法度榜样、JDBC到通用收集协议驱动法度榜样或数据库厂商供给的驱动法度榜样。在这种环境下测试驱动法度榜样的顺序至关紧张,由于DriverManager将应用它所找到的第一个可以成功连接到给定URL的驱动法度榜样。

首先DriverManager试图按注册的顺序应用每个驱动法度榜样(jdbc.drivers中列出的驱动法度榜样老是先注册)。它将跳过代码弗成相信的驱动法度榜样,除非加载它们的源与试图打开连接的代码的源相同。它经由过程轮流在每个驱动法度榜样上调用措施Driver.connect,并向它们通报用户开始通报给措施DriverManager.getConnection的URL来对驱动法度榜样进行测试,然后连接第一个认出该URL的驱动法度榜样。这种措施初看起来效率不高,但因为弗成能同时加载数十个驱动法度榜样,是以每次连接实际只需几个历程调用和字符串对照。

以下代码是平日环境下用驱动法度榜样(例如JDBC-ODBC桥驱动法度榜样)建立连接所需所有步骤的示例:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动法度榜样

String url = "jdbc:odbc:fred";

DriverManager.getConnection(url,"userID","passwd");

您可能还会对下面的文章感兴趣: