📄 drivermanager.doc.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=gb2312">
<title></title>
</head>
<body bgcolor="#ffffff">
<table width="600">
<tr>
<td><font size="-1"><a href="introTOC.doc.html">目录</a> | <a href="connection.doc.html">上一页</a>
| <a href="statement.doc.html">下一页</a> </font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入门</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="999037"></a> </p>
<h1>3 - DriverManager</h1>
<p>本概述摘自《<em>JDBC<font size="-1"><sup>TM</sup></font> Database Access from
Java<font size="-1"><sup>TM</sup></font>: A Tutorial and Annotated Reference</em>》,目前正由
JavaSoft 继续编写。这本书既是 JDBC
的教程,也是一本权威性参考手册,将作为 Java 系列的一部分在 1997
年春季由 Addison-Wesley 出版公司出版。</p>
<p><a name="999083"></a> </p>
<h2>3.1 概述</h2>
<code>
<p>DriverManager</code> 类是 JDBC
的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,<code>DriverManager</code>
类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。</p>
<p><a name="999049"></a>对于简单的应用程序,一般程序员需要在此类中直接使用的唯一方法是
<code>DriverManager.getConnection</code>。正如名称所示,该方法将建立与数据库的连接。JDBC
允许用户调用 <code>DriverManager</code> 的方法 <code>getDriver</code>、<code>getDrivers</code>
和 <code>registerDriver</code> 及 <code>Driver</code> 的方法 <code>connect</code>。但多数情况下,让
<code>DriverManager</code> 类管理建立连接的细节为上策。</p>
<p><a name="999050"></a> </p>
<h3>3.1.1 跟踪可用驱动程序</h3>
<code>
<p>DriverManager</code> 类包含一列 <code>Driver</code>
类,它们已通过调用方法 <code>DriverManager.registerDriver</code>
对自己进行了注册。所有 <code>Driver</code>
类都必须包含有一个静态部分。它创建该类的实例,然后在加载该实例时
<code>DriverManager</code>
类进行注册。这样,用户正常情况下将不会直接调用 <code>DriverManager.registerDriver</code>;而是在加载驱动程序时由驱动程序自动调用。加载
<code>Driver</code> 类,然后自动在 <code>DriverManager</code>
中注册的方式有两种:
<ol>
<p><a name="999052"></a></p>
<li>通过调用方法 <code>Class.forName</code>。这将显式地加载驱动程序类。由于这与外部设置无关,因此推荐使用这种加载驱动程序的方法。以下代码加载类
<code>acme.db.Driver</code>: <pre><a name="999053"></a> Class.forName("acme.db.Driver");
</pre>
<p><a name="999054"></a>如果将 <code>acme.db.Driver</code>
编写为加载时创建实例,并调用以该实例为参数的 <code>DriverManager.registerDriver</code>(本该如此),则它在
<code>DriverManager</code> 的驱动程序列表中,并可用于创建连接。</p>
<p><a name="999056"></a> </p>
</li>
<li>通过将驱动程序添加到 <code>java.lang.System</code> 的属性 <code>jdbc.drivers</code>
中。这是一个由 <code>DriverManager</code>
类加载的驱动程序类名的列表,由冒号分隔:初始化 <code>DriverManager</code>
类时,它搜索系统属性 <code>jdbc.drivers</code>,如果用户已输入了一个或多个驱动程序,则
<code>DriverManager</code> 类将试图加载它们。以下代码说明程序员如何在
<code>~/.hotjava/properties</code> 中输入三个驱动程序类(启动时,HotJava
将把它加载到系统属性列表中): </li>
</ol>
<pre><a name="999057"></a> jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver;
</pre>
<p>对 <code>DriverManager</code>
方法的第一次调用将自动加载这些驱动程序类。</p>
<p>注意:加载驱动程序的第二种方法需要持久的预设环境。如果对这一点不能保证,则调用方法
<code>Class.forName</code>
显式地加载每个驱动程序就显得更为安全。这也是引入特定驱动程序的方法,因为一旦
<code>DriverManager</code> 类被初始化,它将不再检查 <code>jdbc.drivers</code>
属性列表。</p>
<p><a name="999060"></a>在以上两种情况中,新加载的 <code>Driver</code>
类都要通过调用 <code>DriverManager.registerDriver</code>
类进行自我注册。如上所述,加载类时将自动执行这一过程。</p>
<p><a name="999061"></a>由于安全方面的原因,JDBC
管理层将跟踪哪个类加载器提供哪个驱动程序。这样,当 <code>DriverManager</code>
类打开连接时,它仅使用本地文件系统或与发出连接请求的代码相同的类加载器提供的驱动程序。</p>
<p><a name="999062"></a> </p>
<h3>3.1.2 建立连接</h3>
<p>加载 <code>Driver</code> 类并在 <code>DriverManager</code>
类中注册后,它们即可用来与数据库建立连接。当调用 <code>DriverManager.getConnection</code>
方法发出连接请求时,<code>DriverManager</code>
将检查每个驱动程序,查看它是否可以建立连接。</p>
<p><a name="999064"></a>有时可能有多个 JDBC 驱动程序可以与给定的 URL
连接。例如,与给定远程数据库连接时,可以使用 JDBC-ODBC
桥驱动程序、JDBC
到通用网络协议驱动程序或数据库厂商提供的驱动程序。在这种情况下,测试驱动程序的顺序至关重要,因为
<code>DriverManager</code> 将使用它所找到的第一个可以成功连接到给定
URL 的驱动程序。</p>
<p><a name="999065"></a>首先 <code>DriverManager</code>
试图按注册的顺序使用每个驱动程序(<code>jdbc.drivers</code>
中列出的驱动程序总是先注册)。它将跳过代码不可信任的驱动程序,除非加载它们的源与试图打开连接的代码的源相同。</p>
<p><a name="999066"></a>它通过轮流在每个驱动程序上调用方法 <code>Driver.connect</code>,并向它们传递用户开始传递给方法
<code>DriverManager.getConnection</code> 的 URL
来对驱动程序进行测试,然后连接第一个认出该 URL 的驱动程序。</p>
<p>这种方法初看起来效率不高,但由于不可能同时加载数十个驱动程序,因此每次连接实际只需几个过程调用和字符串比较。</p>
<p><a name="999068"></a>以下代码是通常情况下用驱动程序(例如 JDBC-ODBC
桥驱动程序)建立连接所需所有步骤的示例: </p>
<pre><a name="999069"></a> Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动程序
<a
name="999070"></a> String url = "jdbc:odbc:fred";
<a name="999071"></a> DriverManager.getConnection(url, "userID", "passwd");
<a
name="998237"></a>
</pre>
<p><br>
</p>
<hr>
<font size="-1"><a href="introTOC.doc.html">
<p>目录</a> | <a href="connection.doc.html">上一页</a> | <a href="statement.doc.html">下一页</a>
</font></p>
<hr>
<address>
<a href="mailto:jdbc@wombat.eng.sun.com">jdbc@wombat.eng.sun.com</a> 或 <a
href="mailto:jdbc-odbc@wombat.eng.sun.com">jdbc-odbc@wombat.eng.sun.com</a>
</address>
<a href="copyright.doc.html"><font size="-1"><i>
<p>版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利</i></font>。</a><!-- HTML generated by dkramer on March 14, 1997 -->
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -