⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connection.doc.html

📁 JDBC入门中文文档
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<p><a name="1001004"></a> </p>

<pre><a name="1001005"></a>      jdbc:odbc:&lt;<code> 数据资源名称 </code>&gt;[;&lt;<code> 属性名 &gt;</code>=&lt;<code> 属性值 </code>&gt;]*
</pre>

<p><a name="1001007"></a> 因此,以下都是合法的 <code>jdbc:odbc</code> 名称: </p>

<pre><a name="1001008"></a>    <code>  jdbc:odbc:qeor7
</code><a name="1001009"></a>    <code>  jdbc:odbc:wombat
</code><a
name="1001010"></a>    <code>  jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER
</code><a
name="1001011"></a>    <code>  jdbc:odbc:qeora;UID=kgh;PWD=fooey
</code></pre>
<a name="1001012"></a>
<h3>2.1.5 注册子协议</h3>

<p>驱动程序编程员可保留某个名称以将之用作 JDBC URL 
的子协议名。当 <code>DriverManager</code> 
类将此名称加到已注册的驱动程序清单中时,为之保留该名称的驱动程序应能识别该名称并与它所标识的数据库建立连接。例如,<code>odbc</code> 
是为 JDBC- ODBC 桥而保留的。示例之二,假设有个 Miracle 
公司,它可能会将 &quot;miracle&quot; 注册为连接到其 Miracle DBMS 上的 
JDBC 驱动程序的子协议,从而使其他人都无法使用这个名称。</p>

<p><a name="1001014"></a>JavaSoft 目前作为非正式代理负责注册 JDBC 
子协议名称。要注册某个子协议名称,请发送电子邮件到下述地址: 
</p>

<pre><a name="1001015"></a>      jdbc@wombat.eng.sun.com
</pre>
<a name="1001016"></a>
<h3>2.1.6 发送 SQL 语句</h3>

<p>连接一旦建立,就可用来向它所涉及的数据库传送 SQL 语句。JDBC 
对可被发送的 SQL 
语句类型不加任何限制。这就提供了很大的灵活性,即允许使用特定的数据库语句或甚至于非 
SQL 
语句。然而,它要求用户自己负责确保所涉及的数据库可以处理所发送的 
SQL 
语句,否则将自食其果。例如,如果某个应用程序试图向不支持储存程序的 
DBMS 发送储存程序调用,就会失败并将抛出异常。JDBC 
要求驱动程序应至少能提供 ANSI SQL-2 Entry Level 功能才可算是符合 JDBC 
标准<font size="-1"><sup>TM</sup></font> 
的。这意味着用户至少可信赖这一标准级别的功能。</p>

<p>JDBC 提供了三个类,用于向数据库发送 SQL 语句。<code>Connection</code> 
接口中的三个方法可用于创建这些类的实例。下面列出这些类及其创建方法: 

<ol>
  <p><a name="1001019"></a></p>
  <li><code>Statement</code> ─ 由方法 <code>createStatement</code> 所创建。<code>Statement</code> 
    对象用于发送简单的 SQL 语句。<a name="1001020"></a> </li>
  <li><code>PreparedStatement</code> ─ 由方法 <code>prepareStatement</code> 所创建。<code>PreparedStatement</code> 
    对象用于发送带有一个或多个输入参数( IN 参数)的 SQL 语句。<code>PreparedStatement</code> 
    拥有一组方法,用于设置 IN 参数的值。执行语句时,这些 IN 
    参数将被送到数据库中。<code>PreparedStatement</code> 的实例扩展了 <code>Statement</code> 
    ,因此它们都包括了 <code>Statement</code> 的方法。<code>PreparedStatement</code> 
    对象有可能比 <code>Statement</code> 
    对象的效率更高,因为它已被预编译过并存放在那以供将来使用。<a
    name="1001091"></a> </li>
  <li><code>CallableStatement</code> ─ 由方法 <code>prepareCall</code> 所创建。<code>CallableStatement</code> 
    对象用于执行 SQL 储存程序 ─ 
    一组可通过名称来调用(就象函数的调用那样)的 SQL 语句。<code>CallableStatement</code> 
    对象从 <code>PreparedStatement</code> 中继承了用于处理 IN 
    参数的方法,而且还增加了用于处理 OUT 参数和 INOUT 参数的方法。</li>
</ol>

<p><a name="1001022"></a></p>

<p>以下所列提供的方法可以快速决定应用哪个 <code>Connection</code> 
方法来创建不同类型的 SQL 语句: </p>

<p><a name="1001023"></a><a name="1001024"></a></p>

<blockquote>
  <code><p>createStatement</code> 方法用于:<ul>
    <p><a name="1001025"></a></p>
    <li>简单的 SQL 语句(不带参数) <br>
      <br>
    </li>
  </ul>
</blockquote>

<p><a name="1001026"></a><a name="1001027"></a></p>

<blockquote>
  <code><p>prepareStatement</code> 方法用于: <ul>
    <p><a name="1001028"></a></p>
    <li>带一个或多个 IN 参数的 SQL 语句 <br>
      <br>
      <a name="1001029"></a> </li>
    <li>经常被执行的简单 SQL 语句<br>
      <br>
    </li>
  </ul>
</blockquote>

<p><a name="1001030"></a><a name="1001031"></a></p>

<blockquote>
  <code><p>prepareCall</code> 方法用于: <ul>
    <p><a name="1001032"></a></p>
    <li>调用已储存过程<br>
      <br>
    </li>
  </ul>
</blockquote>

<p><a name="1001033"></a></p>
<h3>2.1.7 事务</h3>
<a name="1001034"></a>

<p>事务由一个或多个这样的语句组成:这些语句已被执行、完成并被提交或还原。当调用方法 
<code>commit</code> 或 <code>rollback</code> 
时,当前事务即告就结束,另一个事务随即开始。</p>

<p><a name="1001035"></a>缺省情况下,新连接将处于自动提交模式。也就是说,当执行完语句后,将自动对那个语句调用 
<code>commit</code> 
方法。这种情况下,由于每个语句都是被单独提交的,因此一个事务只由一个语句组成。如果禁用自动提交模式,事务将要等到 
<code>commit</code> 或 <code>rollback</code> 
方法被显式调用时才结束,因此它将包括上一次调用 <code>commit</code> 
或 <code>rollback</code> 
方法以来所有执行过的语句。对于第二种情况,事务中的所有语句将作为组来提交或还原。</p>

<p><a name="1001036"></a>方法 <code>commit</code> 使 SQL 
语句对数据库所做的任何更改成为永久性的,它还将释放事务持有的全部锁。而方法 
<code>rollback</code> 将弃去那些更改。</p>

<p><a name="1001037"></a>有时用户在另一个更改生效前不想让此更改生效。这可通过禁用自动提交并将两个更新组合在一个事务中来达到。如果两个更新都是成功的,则调用 
<code>commit</code> 
方法,从而使两个更新结果成为永久性的;如果其中之一或两个更新都失败了,则调用 
<code>rollback</code> 方法,以将值恢复为进行更新之前的值。</p>

<p><a name="1001038"></a>大多数 JDBC 驱动程序都支持事务。事实上,符合 
JDBC 的驱动程序必须支持事务。<code>DatabaseMetaData</code> 
给出的信息描述 DBMS 所提供的事务支持水平。</p>

<p><a name="1001039"></a> </p>

<h3>2.1.8 事务隔离级别</h3>

<p>如果 DBMS 
支持事务处理,它必须有某种途径来管理两个事务同时对一个数据库进行操作时可能发生的冲突。用户可指定事务隔离级别,以指明 
DBMS 
应该花多大精力来解决潜在冲突。例如,当事务更改了某个值而第二个事务却在该更改被提交或还原前读取该值时该怎么办? 
假设第一个事务被还原后,第二个事务所读取的更改值将是无效的,那么是否可允许这种冲突? 
JDBC 用户可用以下代码来指示 DBMS 允许在值被提交前读取该值(“dirty 
读取”),其中 <code>con</code> 是当前连接: </p>

<pre><a name="1001041"></a>    con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);
</pre>

<p>事务隔离级别越高,为避免冲突所花的精力也就越多。<code>Connection</code> 
接口定义了五级,其中最低级别指定了根本就不支持事务,而最高级别则指定当事务在对某个数据库进行操作时,任何其它事务不得对那个事务正在读取的数据进行任何更改。通常,隔离级别越高,应用程序执行的速度也就越慢(由于用于锁定的资源耗费增加了,而用户间的并发操作减少了)。在决定采用什么隔离级别时,开发人员必须在性能需求和数据一致性需求之间进行权衡。当然,实际所能支持的级别取决于所涉及的 
DBMS 的功能。</p>

<p><a name="1001043"></a>当创建 <code>Connection</code> 
对象时,其事务隔离级别取决于驱动程序,但通常是所涉及的数据库的缺省值。用户可通过调用 
<code>setIsolationLevel</code> 
方法来更改事务隔离级别。新的级别将在该连接过程的剩余时间内生效。要想只改变一个事务的事务隔离级别,必须在该事务开始前进行设置,并在该事务结束后进行复位。我们不提倡在事务的中途对事务隔离级别进行更改,因为这将立即触发 
<code>commit</code> 
方法的调用,使在此之前所作的任何更改变成永久性的。</p>

<p><br>
</p>

<hr>
<font size="-1"><a href="introTOC.doc.html">

<p>目录</a> | <a href="intro.doc.html">上一页</a> | <a href="drivermanager.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>版权所有 &copy; 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 + -