JDBC驱动程序与桥接器的区别

5

我已经在几个应用程序中使用了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需要针对每个系统不同的“驱动程序”呢?

这些驱动程序是什么?它们是做什么的?为什么它们是必需的?另外,对我在此处提出的任何其他说法的澄清将不胜感激。提前感谢!


相关:https://dev59.com/_3E95IYBdhLWcg3wRLwt 如果可能,请获取最新版本。 - BalusC
5个回答

7

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


谢谢Andres...但是Java JDBC驱动器(针对每个数据库)怎么样?为什么它们是必需的?它们有什么作用? - IAmYourFaja
1
他们将JDBC命令(标准命令)翻译成本地数据库协议(非标准命令)。 MS SQL Server协议与Oracle的协议非常不同。 JDBC允许您针对两者运行相同的命令,只需使用不同的驱动程序即可。 合理吗? - Andres Olarte
1
是的,Andres说得很有道理。虽然非常接近,但我必须出于完全主观的原因将最佳答案(在我谦虚的意见中)给Pablo。非常感谢您回答我的问题,我会为您的回答点赞。 - IAmYourFaja

7

你已经快完成了,好问题。

这些驱动程序是什么:纯JDBC驱动程序是用Java编写的驱动程序,不需要ODBC驱动程序即可工作。只有在没有直接的JDBC驱动程序适配你的数据库时(这极为罕见,因为现在大多数数据库都支持JDBC),才应使用ODBC驱动程序(通过JDBC-ODBC桥接器)。

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

以前选择ODBC或本地驱动程序是出于性能原因,但我认为现在纯Java/JDBC表现几乎与本地/ODBC相同。

它们的作用是什么:与ODBC相同。提供标准化的Java API来访问关系型数据库。

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


谢谢Pablo - 那么我应该理解JDBC(Java API)实际上是“依赖于”在运行时提供的正确JDBC驱动程序(特定于数据库)吗? - IAmYourFaja
感谢您提供了知识渊博、不炫耀的答案! - IAmYourFaja

2
只是因为DB使用“标准”SQL(这里加引号是有原因的),并不意味着DB使用相同的低级协议进行通信。SQL仅仅是一种语法,而不是协议。
Postgres和Oracle等的协议差别很大,即使它们都使用类似的SQL特性,也提供了不同的功能。
SQL本身虽然是标准的,但在实现中存在广泛的偏差。例如,MySQL以不如其他DB符合SQL标准而臭名昭著。虽然今天使用的大部分SQL可在各个DB之间移植,但还有许多不能移植的内容。
JDBC和ODBC是近亲。它们提供了一个共享接口,使您的应用程序可以与RDBS交互。它们还为供应商提供了一个通用模型来实现。这些就是驱动程序。
供应商实现驱动程序以允许符合JDBC/ODBC的程序与他们的数据库通信。驱动程序的任务是将ODBC/JDBC调用转换为适当的SQL或其他控制调用,以供数据库使用。
JDBC/ODBC桥是一个JDBC驱动程序,它与现有的ODBC驱动程序进行通信。这是一种丑陋的方法,不要使用它。今天所有重要的数据库都有JDBC驱动程序。如果可能的话,请坚持使用“类型4”JDBC驱动程序,因为这些是本地Java而不是使用JNI到二进制的“类型2”驱动程序。有缺陷的类型4驱动程序会抛出异常,有缺陷的类型2驱动程序会导致JVM崩溃,从而使您的应用服务器被炸掉。谢谢。

谢谢Will - 请看一下我对Pablos Santa Cruz的回答的评论 - 我也有同样的问题问你! - IAmYourFaja

2

没错,你已经很接近全貌了!

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;ODBC是特定于Windows的,但JDBC理论上是跨平台的。


这个解释得非常好。你有用通俗易懂的语言解释技术概念的天赋,请继续在SO上写更多。非常感谢你的回答。 - Saurabh Patil

1
  • JDBC是Java连接数据库的方式,使用用Java编写的驱动程序(自JDBC4以来)。
  • ODBC是MS Windows连接数据库的方式,这些驱动程序通常是用C编写的。
  • JDBC-ODBC桥是一种相当古老的东西,在Java早期,不是所有的驱动程序都有一个JDBC版本可用,因此构建了一个通用的桥梁来连接JDBC和已经存在的ODBC驱动程序。

谢谢stacker - 请看看我对Andres答案的评论。我对你有同样的问题! - IAmYourFaja
@zharvey 桥接器正在将Jdbc Api翻译为Odbc Api,因此这样的连接取决于odbc驱动程序。 - stacker

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