JDBC PreparedStatement.executeQuery() 的详细信息
Posted
技术标签:
【中文标题】JDBC PreparedStatement.executeQuery() 的详细信息【英文标题】:Details of JDBC PreparedStatement.executeQuery() 【发布时间】:2021-06-13 12:55:03 【问题描述】:当我们使用 PreparedStatement 执行 SQL 查询时(如此处所述 http://tutorials.jenkov.com/jdbc/preparedstatement.html),如果我们使用 SQL Server 或 Postgres 之类的数据库,executeQuery() 方法究竟做了什么?它将 SQL 查询直接转换为一组数据库操作,还是对数据库服务器进行网络调用,将 SQL 查询转换为数据库操作? 这通常是关于 SQL Server 等数据库如何工作的问题。我只是想知道它们是否在与调用 executeQuery() 的服务器不同的服务器上运行。
【问题讨论】:
“翻译查询”是什么意思?查询在服务器上准备好,然后使用您提供的参数集在服务器上执行。但是,每个数据库的详细信息有所不同。可能有 JDBC 驱动程序,其中驱动程序编译查询并在数据库服务器上执行低级操作,但这对于 SQL 是普通查询语言的数据库来说是不寻常的。 我的意思是获取 SQL 查询并将其转换为一组低级操作来执行它。我只是想知道它是在调用 executeQuery() 的同一台服务器上运行还是在专用数据库服务器上运行。 【参考方案1】:实现细节因数据库系统而异,但通常使用 SQL 作为其本机查询语言的 RDBMS 的 JDBC 驱动程序将按如下方式工作:
-
执行
Connection.prepareStatement(...)
时,会将查询发送到数据库服务器进行编译
在PreparedStatement.executeQuery()
,驱动程序发送一个执行命令和收集的参数值,数据库服务器使用这些参数值执行之前编译的语句。
换句话说,驱动程序不关心数据库服务器上的低级操作,而只是向数据库服务器发送一个'compile'和'execute-with-parameters'命令,由数据库服务器负责的低级操作。
需要明确的是,并非所有驱动程序都以这种方式工作。例如,默认情况下 mysql Connector/J 在本地“编译”语句(确定参数的数量),并在执行时将参数值(适当转义)内联到语句中,然后发送带有文字的 SQL 字符串在数据库服务器上执行的值而不是参数。但是,在这种情况下,数据库服务器仍然负责确定和执行必要的低级操作。
另一方面,某些 NoSQL 数据库(或其他类型的数据存储)的驱动程序完全有可能将 SQL 查询转换为该数据存储上的低级操作。
【讨论】:
感谢您的回复。你说“查询被发送到数据库服务器进行编译”,那么如果数据库是例如 SQL Server,会有一个专用的服务器吗?该数据库服务器是否在操作系统的后台运行?我认为我们不需要自己手动运行数据库服务器 @alfer SQL Server 是 - 除非您使用 SQL Server localdb(Microsoft SQL Server JDBC 驱动程序不支持) - 一个接受客户端连接并执行必要工作的服务器进程管理数据、处理插入、选择和事务等。这是大多数数据库系统的工作方式。 当您说“SQL Server 是”时,您的意思是它确实在后台运行?因此大多数数据库系统在后台运行,无需手动启动 @alfer 是的,通常数据库服务器在安装数据库的主机启动时启动。他们监听一个端口,接受连接,然后为这些连接做必要的工作。 你知道对于像 RabbitMQ 这样的消息代理是否也一样吗?它们是独立运行的(我们不需要手动启动它们)还是应用服务器的一部分?以上是关于JDBC PreparedStatement.executeQuery() 的详细信息的主要内容,如果未能解决你的问题,请参考以下文章