来自数据库管理系统,作者:Raghu Ramakrishnan,Johannes Gehrk
ODBC和JDBC在可执行文件级别实现可移植性 引入额外的间接层次。全部直接 与特定DBMS的交互通过a进行 DBMS特定的驱动程序。驱动程序是一个软件程序 将ODBC或JDBC调用转换为特定于DBMS 呼叫即可。驱动程序是按需动态加载的 应用程序将访问的DBMS仅在以下时才知道 运行。可用的驱动程序已在驱动程序中注册 经理。
值得注意的一点是一个驱动程序没有 必然需要与理解的DBMS交互 SQL 即可。 驱动程序转换SQL就足够了 命令从应用程序转换为等效命令 DBMS理解。因此,在本节的其余部分,我们 指驱动程序与之作为数据源进行交互的数据存储子系统。
“DBMS特定的驱动程序将ODBC或JDBC调用转换为 DBMS特定的调用。“DBMS特定的调用”在这里意味着什么?是 他们的SQL语句?
“驱动程序将应用程序中的SQL命令转换为DBMS理解的等效命令。”
“DBMS理解的等效命令”在这里意味着什么?它们是SQL语句吗?
使用JDBC API的应用程序使用的SQL方言是什么?它是否与标准化SQL相同或非常接近,因为它不能是MySQL,PostgreSQL,SQL Server或Oracle数据库中使用的SQL方言?
“驱动程序不一定需要与理解SQL的DBMS交互。”
答案 0 :(得分:1)
JDBC驱动程序从Java应用程序接收JDBC API(通常是DBMS不可知)调用,并向DBMS发出特定于DBMS的API调用。 ODBC驱动程序从C应用程序接受ODBC API(通常是DBMS不可知)调用,并向DBMS发出特定于DBMS的API调用(通常但不总是向DBMS“本机”网络客户端库)。
在某些情况下,ODBC和JDBC标准为SQL提供了特殊的语法,这些语法在DBMS之间变化很大。该应用程序发出符合标准的特殊SQL语法,DBMS特定的驱动程序将该DBMS不可知的SQL方言转换为目标DBMS的DBMS特定方言。 (示例ODBC section,示例JDBC section)
答案 1 :(得分:1)
DBMS特定的调用意味着驱动程序将您对JDBC API的调用转换为对数据库服务器上的API的调用(可能不同,甚至可能非常不同)。例如,调用Connection.createStatement()
可能会转换为使用命令allocateStatement
等效命令在这里意味着,驱动程序可以解析您的SQL并将其转换为完全不同的查询语言,甚至可以转换为数据库理解的低级命令。例如,考虑允许您查询excelsheet的JDBC或ODBC驱动程序。 Excel本身不了解SQL。
另一个例子,Firebird的前身之一有自己的查询语言(这是在SQL标准化之前),它总是被编译成低级命令。当他们最初添加对(动态)SQL的支持时,这纯粹是在客户端驱动程序中实现的。此客户端驱动程序将SQL语句解析并编译为相同的低级命令,然后将这些命令发送到服务器。服务器不理解SQL,而是接收了等效命令'它确实理解。