Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行子查询以决定是否跳过外部查询,don';如果跳过,是否不发送参数?_Java_Postgresql_Jdbc_Subquery_Query Parameters - Fatal编程技术网

Java 运行子查询以决定是否跳过外部查询,don';如果跳过,是否不发送参数?

Java 运行子查询以决定是否跳过外部查询,don';如果跳过,是否不发送参数?,java,postgresql,jdbc,subquery,query-parameters,Java,Postgresql,Jdbc,Subquery,Query Parameters,我有一个在JavaJDBC中使用的查询 INSERT INTO account_photos (token, image, image_id, order_count) SELECT ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 from account_photos where image_id = ?) 即使image\u id在表中,当它获取image时,它似乎会导致服务器负载和带宽使用率非常高 如果not EXISTS(不存在)为非真,是否仍有不获取图像

我有一个在JavaJDBC中使用的查询

INSERT INTO account_photos (token, image, image_id, order_count) SELECT ?, ?, ?, ?  WHERE NOT EXISTS (SELECT 1 from account_photos where image_id = ?)
即使
image\u id
在表中,当它获取
image
时,它似乎会导致服务器负载和带宽使用率非常高


如果not EXISTS(不存在)为非真,是否仍有不获取图像的方法?

在此查询中,图像数据将在查询开始前传输到服务器。查询处理分阶段进行:

  • 解析:从客户端读取查询文本,验证其语法,并将其转换为描述查询的内部结构
  • 绑定:从客户端读取查询参数,并将其与解析查询中的占位符匹配
  • 执行:实际运行查询
如果不存在(选择…
则在执行阶段执行。绑定阶段已经完成,这是一个绑定阶段,图像数据通过网络传输到数据库服务器的内存中

在绑定参数之前,不能让PostgreSQL运行部分查询。PostgreSQL不支持惰性参数绑定,只有在查询需要参数数据时,才会回调客户端以请求参数数据。这没有什么根本不可能的,只是当前的PostgreSQL协议、客户机驱动程序或数据库服务器不支持它

因此,您必须分两个阶段执行此操作,作为两个单独的查询。检查图像是否存在,仅当图像不存在时,才将其插入


注意:您的查询可以尝试插入图像两次,因为对于
不存在(选择…
),两个并发查询都可能返回
false
,因此都可以继续执行
insert

“看起来它导致了非常高的服务器负载”-您怎么知道?你检查执行计划了吗?Postgres不会在sub-select语句中检索图像,那么您认为它为什么会这样做呢?是java进程和db之间的网络使用问题吗?或者在执行查询时仅对数据库本身执行查询?如果是后者,是否在image_id上有索引?@a_horse_和_no_name是否存在检查导致postgres高负载的查询?分两个阶段进行操作-首先插入一行没有图像(NULL或空文件),然后检查executeUpdate返回的行数以查看是否插入了记录,如果是,然后执行插入记录的更新,发送正确的图像文件。并在最后完成提交。