OCI和THIN驱动器连接与Java和Oracle XE之间的数据源连接有什么区别?

30

我正在编写以下代码,用于使用3种方式(OCI、THIN和数据源)在Java和Oracle 10g XE之间进行连接。代码成功运行,但不知道THIN和OCI与数据源连接之间的区别。

1-

public static void main (String args[]) throws SQLException
 {
  OracleDataSource ods = new OracleDataSource();
  ods.setURL("jdbc:oracle:thin:hr/hr@localhost:1521/XE");
  Connection con = ods.getConnection();
  System.out.println("Connected");
  con.close();
 }
public static void main(String args[])
     {
      try
      {
       // load oracle driver
      Class.forName("oracle.jdbc.driver.OracleDriver");
      // connect using Thin driver
      Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","hr","hr");
      System.out.println("Connected Successfully To Oracle");
      con.close();
      }
      catch(Exception ex)
      {
        ex.printStackTrace();
      }
 }
public static void main(String args[])
     {
      try
      {
       // load oracle driver
      Class.forName("oracle.jdbc.driver.OracleDriver");
      // connect using Native-API (OCI) driver
      Connection con = DriverManager.getConnection("jdbc:oracle:oci:@","hr","hr" );
      System.out.println("Connected Successfully To Oracle using OCI driver");
      con.close();
      }
      catch(Exception ex)
      {
        ex.printStackTrace();
      }
 }
2个回答

48

Oracle提供了四种数据库驱动程序,但我只会列举你询问的两种。

OCI驱动程序是一种类型2 JDBC驱动程序,并使用本机代码连接到数据库。因此,在仅有本机Oracle驱动程序可用的平台上才是一个选项,它不是一个“纯”Java实现。

Oracle的JDBC Thin驱动程序是一种类型4 JDBC驱动程序,使用Java套接字直接连接到Oracle。它直接实现了Oracle的SQL*Net TCP/IP协议。因为它是100% Java,所以它是平台无关的,也可以从Applet中运行。(尽管你不应该这样做)


@suvasis 点击我的回答中的 oci,然后滚动到外部链接部分。 - Elliott Frisch
这个链接更详细地描述了编程和ProC概念的比较。我想知道是否有任何链接可以描述在应用程序端和服务器端需要配置的所有设置方面的差异。更多关于实现/开发的角度。如果您有任何的话。 - Suvasis
AFAIK 的意思是什么?你的意思是在 URL 连接字符串中只需将“thin”替换为“oci”,就可以更改瘦客户端和 OCI 驱动程序使用吗? - Suvasis
据我所知,即使是轻量级驱动程序也仅以纯Java实现了OCI(Oracle Call Interface)。 - Elliott Frisch
3
这里包含一些有用的信息:https://dev59.com/8HE85IYBdhLWcg3wMQhm - tharindu_DG
显示剩余5条评论

10

JDBC thin driver和JDBC OCI driver都使用相同的网络协议,从服务器的角度来看,两者没有区别。JDBC thin driver是100% Java编写的,并且只需要一个单独的jar文件(一些高级功能需要额外的jar文件)。JDBC OCI driver通过JNI调用OCI C客户端库,因此需要安装Oracle完整客户端(OCI也是sqlplus使用的)。Oracle建议使用JDBC thin driver,这也是大多数客户使用的驱动程序。它是最快的驱动程序,也是最稳健的驱动程序。


Oracle建议使用JDBC thin driver[...]。它是最快的驱动程序,也是最强大的驱动程序。您是否有这个声明的来源?我也相信这是正确的,但我需要一个官方来源来证明它,而我似乎找不到任何来源。 - LordOfThePigs
4
Oracle WebLogic Server仅支持thin driver(不支持JDBC OCI)。这意味着所有Oracle Fusion Apps都使用thin driver。此外,所有Oracle性能出版物(SPecJ和YCSB)均使用JDBC thin driver。在我们所有的OOW演示中,我们建议使用thin driver。顺便说一下,我是Oracle公司的员工,我的团队负责开发这些驱动程序。这已经足够正式了吗? - Jean de Lavarene
1
听起来不错 :-). 我希望我们的DBA能够听取您的建议。但是似乎他们不喜欢thin driver,因为故障转移配置必须通过JDBC URL而不是tnsnames.ora进行。或者有没有办法让thin driver也读取这个文件呢?正如您所看到的,我不是专家,我只是一个非常烦恼的开发人员,因为必须始终保持Oracle客户端和驱动程序同步。我自己更喜欢使用thin client。 - LordOfThePigs
2
@LordOfThePigs 是的,您可以使用tnsnames.ora与thin driver。为此,您需要设置驱动程序知道在哪里找到文件,方法是设置属性“oracle.net.tns_admin”,可以作为连接属性或Java系统属性(使用java -D设置)。该值应为tnsnames.ora所在的目录。然后url是jdbc:oracle:thin:@<tns_alias>。如果您需要帮助,请直接与我联系。 - Jean de Lavarene
1
我刚刚收到了更多反馈。我被告知薄驱动程序不支持透明应用程序故障转移(TAF),但只支持快速连接故障转移(FCF)。这份文档(http://www.oracle.com/technetwork/database/app-failover-oracle-database-11g-173323.pdf)似乎是这样说的,但它已经8年了。这仍然正确吗?我认为这个讨论仍然与这个问题的范围相关。额外的澄清可能稍后可以添加到您的答案中。 - LordOfThePigs
2
虽然TAF仅在JDBC-OCI驱动程序中得到支持是事实,但从12.2.0.1版本开始,JDBC thin支持一种更完整的重放功能,称为应用程序连续性(AC)。我们鼓励所有客户使用AC而不是TAF。 - Jean de Lavarene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接