📄 jdbc-spec.frame6.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="jdbc-spec.frame.html">目录</a> | <a
href="jdbc-spec.frame5.html">上一页</a> | <a href="jdbc-spec.frame7.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="20470"></a> </p>
<h2>6 数据库连接</h2>
<p>有关完整的接口描述,参见第 <a href="jdbc-spec.frame13.html#4165">13</a>
章的 Java 接口。 </p>
<p><a name="4698"></a> </p>
<h3>6.1 打开连接</h3>
<p>当需要访问数据库时,可从 JDBC 管理层的
java.sql.DriverManager.getConnection 方法获得 java.sql.Connection 对象。 </p>
<p><a name="16343"></a>DriverManager.getConnection 方法将 URL 字符串用作参数。JDBC
管理层将尝试定位驱动程序,以便连接到 URL
所代表的数据库。如果可连接到给定的 URL,则 JDBC
管理器将通过依次询问每个驱动程序来实现定位(参见下文第 <a
href="jdbc-spec.frame6.html#16326">6.2</a> 节)。<a href="#25398"><sup>1</sup></a>驱动程序应检查
URL 是否指定其支持的子协议(参见下文第 <a
href="jdbc-spec.frame6.html#16290">6.3</a>
节)。如果是,这些驱动程序应尝试连接到指定的数据库。如果成功地建立连接,则这些驱动程序应返回相应的
java.sql.Connection 对象。 </p>
<p>从 java.sql.Connection 对象有可能获得 java.sql.Statement、java.sql.PreparedStatement
及用于执行 SQL 语句的 java.sql.CallableStatement 对象。 </p>
<p><a name="8410"></a>在连接打开期间,我们也允许应用程序绕过 JDBC
管理层,同时允许显式地选用驱动程序。 </p>
<p><a name="16326"></a> </p>
<h3>6.2 选择驱动程序</h3>
<p>有时,多个 JDBC 驱动程序可连接到一个给定的 URL
上。例如,当连接到给定远程数据库时,既可使用 JDBC-ODBC
桥驱动程序、通用网络协议驱动程序的 JDBC,也可使用由数据库厂商提供的驱动程序。
</p>
<p><a name="16331"></a>JDBC 允许用户通过设置 Java 属性 jdbc.drivers
来指定驱动程序列表。如果属性被定义,应是以冒号分隔的驱动程序类名,例如“acme.wonder.Driver
:foobaz.openNet.Driver:vendor.OurDriver”。 </p>
<p>搜索驱动程序时,JDBC 将使用找到的第一个可成功连接到给定 URL
的驱动程序。它将首先尝试按给定顺序使用 sql.drivers
列表中指定的驱动程序,然后将尽量按照加载驱动程序的顺序继续使用每个加载了的驱动程序。它将忽略所有不可信任代码的驱动程序,除非它们是从与试图打开连接的代码相同的源加载的(参见第
<a href="jdbc-spec.frame5.html#4985">5</a> 节中的安全性讨论)。 </p>
<p><a name="16290"></a> </p>
<h3>6.3 URL</h3>
<h4>6.3.1 JDBC 数据库命名的目标</h4>
<p>我们需要提供命名数据库的方法,以便应用程序编写人员可指定所要连接的数据库。
</p>
<p><a name="16427"></a>该 JDBC 命名机制应具有如下属性:
<ul>
<li><a name="16428"></a>不同驱动程序可使用不同的数据库命名机制。例如,JDBC-ODBC
桥驱动程序可支持简单 ODBC
风格的数据源名称,而网络协议驱动程序需了解附加信息以便查找所要连接的主机名和端口。</li>
<li><a name="16441"></a>如果用户下载的 applet
想和给定的数据库通讯,则我们希望用户不需做任何系统管理便可打开数据库连接。例如,在客户机上,我们希望能避免使用类似于人为管理的
ODBC 数据源表。这表明在 JDBC
名称中可以对任何所需的连接信息进行编码。</li>
<li>我们允许 JDBC
名称中使用间接层,以便能通过某些网络命名系统解析初始名来定位数据库。这可以使系统管理员避免将特定主机指定为
JDBC 名称的一部分。但是,由于存在许多不同的网络命名服务(如 NIS、DCE
等),所以我们不想强制指定某种网络名字服务器。 <a name="16429"></a>
</li>
</ul>
<h4>6.3.2 URL 语法</h4>
<p>幸运的是,万维网已在支持所有这些属性的命名系统上实现标准化,这就是统一资源定位符
(URL) 机制。因此,我们计划将 URL 用于 JDBC
命名,而且打算只推荐某些构造 JDBC URL 的规则。 </p>
<p><a name="16555"></a>我们推荐如下方法来构造 JDBC URL: </p>
<p><a name="16556"></a> jdbc:<子协议>:<子名称> </p>
<p>其中,子协议将命名可被一个或多个驱动程序支持的数据库连接机制。子名称的内容和语法依赖于子协议。
</p>
<p><a name="16562"></a>如果将网络地址指定为子名称的一部分,则为子名称推荐“//hostname:port/subsubname”形式的标准
URL 命名规则。子名称的子名称可具有任意的内部语法。 </p>
<p><a name="16551"></a> </p>
<h4>6.3.3 URL 示例</h4>
<p>例如,为通过 JDBC-ODBC 桥访问数据库,可使用如下 URL: </p>
<p><a name="16507"></a> jdbc:odbc:fred </p>
<p>该示例中,子协议是“odbc”,子名称是本地 ODBC 数据源名称“fred”。JDBC-ODBC
驱动程序可检查具有“odbc”子协议的 URL,然后在 ODBC SQLConnect
内使用该子名称。 </p>
<p>如果是使用某种通用数据库连接协议“dbnet”与数据库接收器进行交流,则可使用如下
URL: </p>
<p><a name="16529"></a> jdbc:dbnet://wombat:356/fred </p>
<p><a name="30804"></a>示例中,URL 指定应在主机 wombat 上使用“dbnet”协议来连接到端口
356,然后将子名称的子名称“fred”提交到该端口,以便定位最终的数据库。
</p>
<p>如果希望数据库名称中用某些网络名字服务器提供间接层,最好将命名服务的名称用作子协议。例如,可使用如下
URL: </p>
<p><a name="16531"></a> jdbc:dcenaming:accounts-payable </p>
<p><a name="16583"></a>该示例中,URL 指定应使用本地 DCE
命名服务将数据库名“accounts-payable”解析为更确定的名称,以便连接到真实的数据库。某些情况下,可以提供通过名字服务器执行名字查找的伪驱动程序,然后使用其结果定位真实服务器并打开真实连接。
</p>
<p><a name="16584"></a> </p>
<h4>6.3.4 驱动程序可选择语法并忽略其它 URL。</h4>
<p>总的来说,JDBC URL
机制负责提供框架,以便不同的驱动程序可使用适合各自需求的命名系统。每个驱动程序只需知道一个
URL 命名语法,而且可拒绝任何其它 URL。 </p>
<p><a name="11833"></a> </p>
<h4>6.3.5 注册子协议名称</h4>
<p>JavaSoft 将充当 JDBC
子协议名称的非正式注册服务程序。要预留子协议名称,请发送邮件到
jdbc@wombat.eng.sun.com。 </p>
<p><a name="25343"></a> </p>
<h4>6.3.6 “odbc”子协议</h4>
<p>我们已为指定 ODBC 风格“Data Source Names”的 URL 预留了 odbc
子协议。对于该子协议,我们指定的 URL
语法允许在数据源名称之后指定任意属性值。 </p>
<p><a name="25356"></a>完整的 odbc 子协议 URL 语法是: </p>
<pre><code>jdbc:odbc:<<em>数据-源-名称</em>>[;<<em>属性-名称</em>>=<<em>属性-值</em>>]*
</code></pre>
<p>因此,有效的 jdbc:odbc 名称包括: </p>
<pre><code>jdbc:odbc:qeor7
</code></pre>
<pre><code>jdbc:odbc:wombat
</code></pre>
<pre><code>jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER
</code></pre>
<pre><code>jdbc:odbc:qeora;UID=kgh;PWD=fooey
</code></pre>
<pre><code>
</code></pre>
<h3>6.4 连接参数</h3>
<p>打开连接时,可以将 java.util.Properties
对象传入。该对象是保存标记字符串与值字符串之间映射的属性集。两种常规属性是“user”和“password”。某些驱动程序可指定并使用其它属性。
</p>
<p><a name="16935"></a>为使 applet
能通过常规方法访问数据库,最好将尽可能多的连接信息编码为 URL
的组成部分,而驱动程序编写人员最好将属性的用途设置为最少。 </p>
<p><a name="16922"></a> </p>
<h3>6.5 多重连接</h3>
<p>使用一个或多个驱动程序,一个应用程序可建立到一个或多个数据库的多重连接。
</p>
<p><a name="4731"></a> </p>
<h3>6.6 注册驱动程序</h3>
<p>JDBC
管理层需要知道可用的数据库驱动程序。为此,我们提供两种方法。
</p>
<p><a name="4736"></a>第一种,当 JDBC java.sql.DriverManager
类初始化时,在系统属性中查找“sql drivers”属性。如果该属性存在,则它应包括一列以冒号分隔的驱动程序类名。每个被命名的类都应实现
java.sql.Driver 接口。DriverManager 类将尝试加载每一命名的 Driver 类。 </p>
<p>第二种,通过采用标准 Class.forName
方法,程序员可显式地加载驱动程序类。例如,要加载 acme.db.Driver
类,可以执行: </p>
<pre><code>Class.forName("acme.db.Driver");
</code></pre>
<p>两种情况下,每个新加载的 Driver 类自己负责用
DriverManager.registerDriver 方法向 DriverManager 进行注册。这将允许
DriverManager 在试图进行数据库连接时使用驱动程序。 </p>
<p><a name="4751"></a>为安全起见,JDBC
管理层将记录下哪个类加载器提供了哪个驱动程序。在打开连接时,它将只使用来自本地文件系统或与发布
getConnection 请求的代码来自同一类加载器的驱动程序。 </p>
<p><br>
</p>
<hr>
<font size="-1"><a href="jdbc-spec.frame.html">
<p>目录</a> | <a href="jdbc-spec.frame5.html">上一页</a> | <a
href="jdbc-spec.frame7.html">下一页</a> </font></p>
<hr>
<sup>
<p>1</sup><a name="25398"></a>表面上这似乎会降低效率,但请注意:由于同时加载多个驱动程序的可能性不大,所以每次连接将只需要几个过程调用和字符串比较。
</p>
<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="../../../relnotes/SMICopyright.html"><font size="-1"><i>
<p>版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利。</i></font> </a><!-- HTML generated by Suzette Pelouch on April 10, 1998 -->
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -