【问题标题】:JDBC Driver vs BridgeJDBC 驱动程序与桥接器
【发布时间】:2011-11-11 18:44:03
【问题描述】:

我现在在几个应用程序中使用 JDBC 来查询 Derby、PostgreSQL 和现在的 MySQL 数据库。我想我在试图理解引擎盖下实际发生的事情时被一些基本术语窒息。我见过的几个术语:

  • ODBC
  • JDBC 驱动程序
  • JDBC-ODBC 桥

我尽我最大的努力去挖掘并了解它们是什么、它们做什么以及它们之间的关系。我相信我已经完成了大约 70% 的工作,但我似乎找不到任何东西(文章、博客、文档等)可以将所有内容很好地结合在一起并证实我的怀疑。

似乎 ODBC 是一个 C 库(可能是 DLL?),程序可以使用它与 RDBM 系统(例如 PostgreSQL 和 MySQL)进行通信。对这些系统的所有查询都流入和流出给定系统上的这个库。

JDBC-ODBC 桥是一个 Java 组件,它包含允许 JDBC 与给定系统上的 ODBC 库通信的本机代码。

JDBC 是用于查询 RDBM 系统的纯 Java API。

JDBC 驱动程序(例如 PostgreSQL-JDBC 驱动程序)是我真正遇到问题的地方。 如果所有 RDBM 系统都遵循 RDBMS 标准,并且可以与 ODBC 库进行通信,那为什么JDBC 需要不同的“驱动程序”吗?

这些驱动程序是什么?他们在做什么?为什么它们是必要的?对我在这里所做的任何其他断言的澄清将不胜感激。提前致谢!

【问题讨论】:

标签: java jdbc odbc


【解决方案1】:

你快到了。好问题。

这些驱动程序是什么:纯 JDBC 驱动程序是用 Java 编写的驱动程序,不需要 ODBC 驱动程序即可工作。当您的数据库没有直接的 JDBC 驱动程序时,您应该只使用 ODBC 驱动程序(通过 JDBC-ODBC 桥)(这种情况极为罕见,因为现在大多数{如果不是全部}数据库都支持 JDBC)。

纯 JDBC 的优点是不需要 ODBC。 ODBC 通常很难配置,并且需要在系统上安装数据库本地客户端库(例如 Oracle OCI 或 Sybase CT 库)。

过去选择 ODBC 或本机驱动程序是出于性能原因,但我认为今天纯 Java/JDBC 的性能几乎与它们的本机/ODBC 对应物一样好。

他们做什么:与 ODBC 相同。用于访问关系数据库的标准化 Java API。

为什么需要它们:它们是必需的,因为使用它们更简单,您只需要 JDBC 库 JAR 和您的 URL 连接。反对:原生客户端库+ODBC驱动+JDBC-ODBC配置。每个数据库都有自己的网络协议来执行查询并返回结果,这也是这种情况。因此,您需要为每个数据库供应商提供一个驱动程序。它们中的每一个都实现了连接到其关系数据库管理器所需的特定协议。如果您在一个所有数据库共享相同 SQL 语言和相同通信协议的世界中,您将只需要一个驱动程序。但这不会很快发生。

【讨论】:

  • 感谢 Pablo - 那么我是否应该理解 JDBC(Java API)实际上“位于”或“依赖”运行时提供的正确 JDBC 驱动程序(特定于 DB)?
  • 感谢您提供消息灵通、谦逊的回答!
【解决方案2】:

ODBC 和 JDBC 是等价的。它们都使用驱动程序将 ODBC(或 JDBC)调用转换为本地数据库命令。 ODBC 较旧并且是用 C/C++ 编写的,而 JDBC 是用 Java 编写的。当 JDBC 出现时,大多数 DB 都没有 JDBC 驱动程序,因此他们创建了 JDBC-ODBC 驱动程序以允许人们利用已经可用的 ODBC 驱动程序。现在很少使用了,因为几乎每个 DB 都有一个纯 Java JDBC 驱动程序

【讨论】:

  • 谢谢 Andres...但是 Java JDBC 驱动程序(每个 DB)呢?为什么它们是必要的?他们是做什么的?
  • 嗯,他们将 JDBC 命令(标准)转换为本地数据库协议(非标准)。 MS SQL Server 协议与 Oracle 的协议非常不同。 JDBC 允许您对两者运行相同的命令,只是使用不同的驱动程序。有意义吗?
  • 是的,安德烈斯很有道理。这是一个非常接近的平局,但出于几个完全主观的原因,我必须给巴勃罗最好的答案(以我的拙见)。非常感谢你回答我的问题,我赞成你的回答。
【解决方案3】:

仅仅因为 DB 使用“标准”SQL(并且出于某种原因将其放在引号中),并不意味着 DB 使用相同的较低级别的协议进行通信。 SQL 只是一种语法,而不是一种协议。

Postgres 和 Oracle 的协议大相径庭,提供不同的功能,尽管它们都使用相似的 SQL 功能。

SQL 本身虽然是标准的,但在实现上存在很大差异。例如,MySQL 因对 SQL 的兼容性低于其他数据库而臭名昭著。虽然今天使用的许多 SQL 都可以跨数据库移植,但也有很多不是。

JDBC 和 ODBC 是志同道合的。它们提供了一个共享接口,您的应用程序可以使用该接口与 RDBS 对话。他们还为供应商提供了一个通用模型来实施。这些是驱动程序。

供应商实现了一个驱动程序,以允许符合 JDBC/ODBC 的程序与他们的数据库通信。驱动程序的任务是将 ODBC/JDBC 调用转换为适当的 SQL 或数据库的其他控制调用。

JDBC/ODBC 桥是与现有 ODBC 驱动程序对话的 JDBC 驱动程序。这是可憎的。不要使用它。今天每个值得注意的数据库都有 JDBC 驱动程序。如果可能的话,坚持使用“类型 4”JDBC 驱动程序,因为它们是原生 Java,而不是使用 JNI 到二进制文件的“类型 2”驱动程序。错误的 4 类驱动程序会给出异常,错误的 2 类驱动程序会导致 JVM 崩溃,从而破坏您的应用服务器。不用了。

【讨论】:

  • 谢谢 Will - 请查看我对 Pablos Santa Cruz 的回答的评论 - 我有同样的问题要问你!
【解决方案4】:

你是对的;您已经非常接近了解全貌了!

JDBC 和 ODBC 在概念上非常相似。它们都是与数据库交互的框架。 JDBC 是 Java 特定的,而 ODBC 是 Windows 特定的。也就是说,JDBC 和 ODBC 实际上都是无牙 API。在 Java 术语中,JDBC 实际上是一组未实现的接口。虽然他们指定了行为契约,但他们本质上并不知道如何与任何特定数据库对话。这就是司机进来的地方。

这里专门说一下JDBC。 JDBC 驱动程序是 JDBC 接口 的具体实现,它们实际上知道如何与底层数据库引擎通信。 JDBC 保证来自 MySQL JDBC 驱动程序的 ResultSet 的行为方式与来自 Postgres JDBC 驱动程序的 ResultSet 相同。

正如其他人所指出的,JDBC/ODBC 桥只是一点点胶水,可以使为 JDBC 编写的代码与 ODBC 基础架构一起使用。一般来说,只有当您确定自己正在专门为 Windows 编写 Java 时,这才有意义。 ODBC 是特定于 Windows 的,但 JDBC(理论上)是跨平台的。

【讨论】:

  • 这很好解释。你有用外行术语解释技术概念的天赋,请继续写更多关于 SO 的文章。非常感谢您的回答。
【解决方案5】:
  • Jdbc 是使用 Java 编写的驱动程序连接到数据库的 Java 方式(自 JDBC4 起)。
  • ODBC 是 MS Windows 连接数据库的方式,这些驱动程序通常用 C 编写
  • JDBC-ODBC 桥是相当古老的东西,在 Java 的早期,并非所有 JDBC 版本的驱动程序都可用,因此在 JDBC 和现有的 ODBC 驱动程序之间构建一个通用桥。

【讨论】:

  • 感谢 stacker - 请看看我对 Andres 回答的评论。我有同样的问题要问你!
  • @zharvey 桥将 Jdbc Api 转换为 Odbc Api,因此这样的连接取决于 odbc 驱动程序。
猜你喜欢
  • 2013-10-25
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2012-11-15
  • 1970-01-01
  • 2020-06-05
  • 2014-05-17
相关资源
最近更新 更多