1、数据库链接(DATABASE LINK)是在分布式环境下,为了访问远程数据库而创建的数据通信链路。数据库链接隐藏了对远程数据库访问的复杂性。通常,我们把正在登录的数据库称为本 地数据库,另外的一个数据库称为远程数据库。有了数据库链接,可以直接通过数据库链接来访问远程数据库的表。常见的形式是访问远程数据库固定用户的链接, 即链接到指定的用户,创建这种形式的数据库链接的语句如下:CREATE DATABASE LINK 链接名 CONNECT TO 账户 IDENTIFIED BY 口令USING 服务名;创建数据库链接,需要 CREATE DATABASE LINK 系统权限。数据库链接一旦建立
2、并测试成功,就可以使用以下形式来访问远程用户的表。表名数据库链接名例:在局域网上创建和使用数据库链接。步骤 1:创建远程数据库的服务名,假定局域网上另一个数据库服务名为MYDB_REMOTE。步骤 2:登录本地数据库 SCOTT 账户,创建数据库链接:CONNECT SCOTT/TIGERMYDBCREATE DATABASE LINK abc CONNECT TO scott IDENTIFIED BY tiger USING MYDB_REMOTE;执行结果为:数据库链接已创建。查询远程数据库的数据:SELECT * FROM empabc;结果略。步骤 4:一个分布查询:SELECT e
3、name,dname FROM empabc e,dept d WHERE e.deptno=d.deptno;结果略。说明:在本例中,远程数据库服务名是 MYDB_REMOTE,创建的数据库链接名称是 abc.empabc 表示远程数据库的 emp 表。步骤 4 是一个联 合查询,数据来自本地服务器的 dept 表和远程服务器的 emp 表。如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编 程人员创建了独立的 UPDATE 命令来成批地更新第一个表中的数据。与此类似的任务可以通过在 set 子句中使用多列子查询而在一个 UPDATE 命令中完 成。当能够在单
4、一的 SQL 命令中完成任务,何必要让数据在网上流来流去的?建议用户认真学习如何最大限度地发挥 SQL 的功能。Oracle 数据库链接时的一些技巧和实例讲解通常在系统中会为常用的对象 预定义了一些同义词,利用它们可以方便地访问用户的常用对象。而在客户端软件开发中使用 Thin 驱动程序,在开发Java 软件方面,Oracle 的数据库 中提供了四种类型的驱动程序,二种用于应用软件、applets、servlets 等客户端软件,另外二种用于数据库中的 Java 存储过程等服务器端软 件。在客户机端软件的开发中,我们可以选择 OCI 驱动程序或 Thin 驱动程序。OCI 驱动程序利用 Jav
5、a 本地化接口(JNI),通过 Oracle客户端 软件与数据库进行通讯。Thin 驱动程序是纯 Java 驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle 建议在客户端软件的开发中使用 OCI 驱动程序,这似乎是正确的。但我建议使用 Thin 驱动程序,因为通过多次测试发现,在通常情况下, Thin 驱动程序的性能都超过了 OCI 驱动程序。我们在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值 false 参数的Connection 类的 setAutoCommit()方法关闭自动提交功能。值得注意的是,一旦关闭
6、了自动提交功能,我们就需要通过调用Connection 类的 commit()和 rollback()方法来人工的方式对事务进行管理。1) Statement 对象的使用数据库链接时不可缺的是 Statement 对象,Statement 对象是 JDBC 程序设计中非常重要的对象,它包含了 SQL 语句的查询和更新的操作, 通过Statement 对象可以完成对数据库的查询和更新操作,可以这样理解:Statement 对象是操作数据库数据的载体。在执行 SQL 命令时,我们 有二种选择:可以使用 PreparedStatement 对象,也可以使用 Statement 对象。无论多少次地使用
7、同一个 SQL 命令,PreparedStatement 都只对它解析和编译一次。当使用 Statement 对象时,每次执行一个 SQL 命令时,都会对它进行解析 和编译。这可能会使你认为,使用 PreparedStatement 对象比使用 Statement 对象的速度更快。然而,我进行的测试表明,在客户端软件 中,情况并非如此。因此,在有时间限制的 SQL 操作中,除非成批地处理 SQL 命令,我们应当考虑使用 Statement 对象。并且,使用 Statement 对象也使得编写动态 SQL 命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的 SQL 命令。因此,我认为,
8、Statement 对象可以使动态 SQL 命令的创建和执行变得更加简单。2) 在动态 SQL 命令中进行格式化链接过程中使用 Statement 对象执行的动态 SQL 命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字 OReilly 插 入表中的 SQL 命令,则必须使用二个相连的“”号替换 OReilly 中的“”号。完成这些工作的最好的方法是创建一个完成替换操作的 helper 方法,然后在连接字符串心服用公式表达一个 SQL 命令时,使用创建的 helper 方法。与此类似的是,我们可以让 helper 方法接受一个 Date 型的 值,然后让它输出基于Ora
9、cle 的 to_date()函数的字符串表达式。3) 如何提高数据库的使用效率当我们使用 PreparedStatement 对象执行 SQL 命令时,preparedstatement 为 jdbc 得 api,他还会创建跟具体数据库 有关的其他资源。命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个 PreparedStatement 对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的 企业级应用软件中,经常会重复执行相同的 SQL 命令,使用 PreparedStatement 对象带来的编译次数的减少能够
10、提高数据库的总体性能。如果不 是在客户端创建、预备、执行 PreparedStatement 任务需要的时间长于 Statement 任务,我会建议在除动态 SQL 命令之外的所有情况下 使用 PreparedStatement 对象。4) 如何成批的处理插入和更新操作在一个表不要加太 多索引,因为索引影响成批插入和更新的速度。Oracle提供的 Statement 和 CallableStatement 并不真正地支持批处理,只有PreparedStatement 对象才真正地支持批处理。我们可以使用 addBatch()和executeBatch()方法选择标准的 JDBC 批处理,或者通
11、过利用PreparedStatement 对象的 setExecuteBatch()方法和标准的 executeUpdate()方法选择速度更快的 Oracle 专有的方法。调用 setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发 SQL 命令执行,标准的 executeUpdate()方法就会 被作为批处理送到数据库中。我们可以通过调用 PreparedStatement 类的 sendBatch()方法随时传输批处理任务。成批的处理插入和更新的例子:An Index full scan will not perform single block i/os
12、and so it may prove to be inefficient. e.g. Index BE_IX is a concatenated index on big_emp (empno, ename) SQL explain plan for select empno, ename from big_emp order by empno,ename; Query Plan SELECT STATEMENTCHOOSE Cost=26 INDEX FULL SCAN BE_IX ANALYZED 5) Oracle 中处理大对象Oracle 在对信息进行处理时,PreparedStat
13、ement 类不完全支持 BLOB 和CLOB 等大对象的处理,尤其是 Thin 驱动程序不支持利 用 PreparedStatement对象的 setObject()和 setBinaryStream()方法设置 BLOB 的值,也不支持利用 setCharacterStream()方法设置 CLOB 的值。只有 locator 本身中的方法才能够从数据库中获取 LOB 类型的值。可以使用 PreparedStatement 对象插入或更新LOB,但需要使用 locator 才能获取 LOB 的值。由于存在这二个问题,因此,我建议使用 locator 的方法来插入、更新或获取 LOB 的值。
14、6) 存储过程的调用用户通过指定存储过程的名 字并给出参数(如果该存储过程带有参数)来执行它,当调用存储过程时,我们可以使用 SQL92 或 Oracle PL/SQL,由于使用Oracle PL/SQL 并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员阿带来麻烦,因此,我建议在调用存储过程时使用 SQL92。可以将 Oracle 的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。对象模式和关系模式之间在发展时可能存在的不 协调性会使得这种同步变得十分地复杂。如果利用 Oracle 的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用 JPublisher 等工具生成自己的 Java bean 类。如果使用这种方式,不但 Java 应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的 对象模式。