Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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 Postgresql集合vs Refcursor_Java_Sql_Postgresql_Jdbc - Fatal编程技术网

Java Postgresql集合vs Refcursor

Java Postgresql集合vs Refcursor,java,sql,postgresql,jdbc,Java,Sql,Postgresql,Jdbc,我在Postgresql中有一个基本用户表 CREATE TABLE myuser ( userId bigserial primary key, user_name varchar(32), password varchar(32) ); 我需要一个存储过程来检索此数据。看看这里的文档:我发现我基本上有两种不同的选择 返回一组myuser 返回包含所需数据的refcursor 我正在使用Java,我想知道哪一个更快,和/或更好。两者在功能上有什么不同?看起来唯一的区别是如何设置Jav

我在Postgresql中有一个基本用户表

CREATE TABLE myuser (
userId    bigserial primary key,
user_name varchar(32),
password  varchar(32)
);
我需要一个存储过程来检索此数据。看看这里的文档:我发现我基本上有两种不同的选择

  • 返回一组myuser
  • 返回包含所需数据的refcursor

  • 我正在使用Java,我想知道哪一个更快,和/或更好。两者在功能上有什么不同?看起来唯一的区别是如何设置Java CallableStatement,但为什么我要选择一个而不是另一个呢?

    我不是PostgreSQL专家,但从我对SQL的了解来看,使用集合几乎总是比使用游标更好,所以我要说,使用集合


    PostgreSQL中也没有存储过程,只有函数。

    我不是PostgreSQL大师,但从我对SQL的了解来看,使用集合几乎总是比使用游标更好,所以我想说,使用集合


    PostgreSQL中也没有存储过程,只有函数。

    游标和记录集之间的主要区别在于可以使用游标控制到客户端的数据传输。当您处理应该从服务器移动到客户端的非常大的数据时,游标非常有用。如果没有游标,PostgreSQL会将所有数据一次推送到客户机内存—速度很快(总时间,但启动时间与总时间相同,并且可能需要大量内存(对于较大的数据))。使用游标,您可以控制从服务器到客户机的行数(总时间通常较大,但开始时间可能较低(不是必须的,取决于更多因素)

    --经典查询 从generate_系列(1100000)中选择*; --一次将100000行推送到客户端 --更少的网络握手,更多的客户端内存消耗 --游标-更多的网络握手, --控制客户端的内存消耗 开始; 为生成_系列(11000000)中的SELECT*声明xx光标; 从xx获取100;--从服务器向客户端读取100行 从xx获取100;--从服务器向客户端读取接下来的100行 ... 犯罪
    游标和记录集之间的一个主要区别是,可以使用游标控制到客户端的数据传输。当您处理应该从服务器移动到客户端的非常大的数据时,游标非常有用。没有游标,PostgreSQL会立即将所有数据推送到客户端内存中—速度非常快(在总时间中,但开始时间与总时间相同,并且可能需要大量内存(对于较大的数据))。使用游标,您可以控制从服务器到客户端的行数(总时间通常较大,但开始时间可能(不必-取决于更多因素)较低

    --经典查询 从generate_系列(1100000)中选择*; --一次将100000行推送到客户端 --更少的网络握手,更多的客户端内存消耗 --游标-更多的网络握手, --控制客户端的内存消耗 开始; 为生成_系列(11000000)中的SELECT*声明xx光标; 从xx获取100;--从服务器向客户端读取100行 从xx获取100;--从服务器向客户端读取接下来的100行 ... 犯罪
    用最简单的方法去做,直到你有理由去尝试幻想。
    SETOF
    更容易使用,而且通常也更理智。除非你发现你有特定的理由开始用refcursors跳圈,否则就使用它。用最简单的方法去做,直到你有理由去尝试幻想。
    SETOF
    更容易使用,更通用ally saner。除非你发现你有特定的理由开始使用refcursors跳转,否则请使用它。这并非在所有方面都是正确的。你不能将光标用于模拟ISAM访问(而不是SQL使用)。使用SQL时,游标是非常实用的工具,主要用于大数据或更好的客户到期时间-您可以更快地获取前N行并用游标显示。这并非在所有方面都是正确的。您不得将游标用于模拟ISAM访问(而非SQL使用)。使用SQL,游标是非常实用的工具,主要用于大数据或更好的客户过期率-您可以更快地获取前N行并使用游标显示。 -- classic query SELECT * FROM generate_series(1,100000); -- 100000 rows is pushed to client at once -- less network handshaking, more client memory consumption -- cursors - more network handshaking, -- controlled memory consumption on client side BEGIN; DECLARE xx CURSOR FOR SELECT * FROM generate_series(1,1000000); FETCH 100 FROM xx; -- read 100 rows from server to client FETCH 100 FROM xx; -- read next 100 rows from server to client ... COMMIT;