LightDB 23.3 通过GUC参数控制commit fetch

news2024/11/20 18:25:08

背景

commit游标提交之后,可以继续使用fetch进行结果集的操作。commit和fetch结合使用功能开发时不用考虑分布式。后续测试分布式时,发现持有portal后,会对querydesc进行非空判断,若querydesc为空,会造成崩溃。加上querydesc判断之后,导致之前使用一个全局变量接收portal的方案失败,一个sql执行完,portal就被释放了。在事务中调用打开游标的函数, 打开的游标不能继续被fetch,报游标不存在。

解决方案

因此决定将commit游标提交之后,可以继续使用fetch进行结果集的操作的功能利用GUC参数lightdb_cursor_after_commit 进行限制,去掉之前使用全局变量存储持有的portal的全部逻辑。
lightdb_cursor_after_commit 为off,不能在一个事务提交之后,再去fetch
操作这个结果集;为on时,一个事务提交时候,这个游标还继续存在。

测试

lightdb_cursor_after_commit 设置成 off

set lightdb_cursor_after_commit to off;                              
create function fg(ref inout refcursor) return int as
begin             
open ref for select * from nested_tab;
return 0;
end;
/
CREATE FUNCTION
lightdb@test_createdb_oracle=# begin;
BEGIN
lightdb@test_createdb_oracle=*# select fg('cf');
 fg 
----
  0
(1 row)

lightdb@test_createdb_oracle=*# fetch all in cf;
 id | name  |  job  | age 
----+-------+-------+-----
  1 | asda  | gfdgd |  12
  2 | sdfsd | cvxvx |  14
  3 | uyiy  | mmbv  |  16
(3 rows) 

lightdb_cursor_after_commit 设置成 on

set lightdb_cursor_after_commit to on; 
create or replace function fg(ref inout refcursor) return int as
begin             
open ref for select * from nested_tab;
return 0;
end;
/
lightdb@test_createdb_oracle=#  begin;
BEGIN
lightdb@test_createdb_oracle=*# select fg('cf');
 fg 
----
  0
(1 row)

lightdb@test_createdb_oracle=*# fetch all in cf;
 id | name  |  job  | age 
----+-------+-------+-----
  1 | asda  | gfdgd |  12
  2 | sdfsd | cvxvx |  14
  3 | uyiy  | mmbv  |  16
(3 rows)

lightdb@test_createdb_oracle=*# commit;
COMMIT
lightdb@test_createdb_oracle=# fetch all in cf;
 id | name | job | age 
----+------+-----+-----
(0 rows)

lightdb@test_createdb_oracle=# fetch all in cf;
ERROR:  cursor "cf" does not exist

java测试:

package test;

import java.math.BigDecimal;
import java.sql.*;

public class PGJdbcOOMTest {

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("org.postgresql.Driver");
            java.lang.String  dbURL = "jdbc:postgresql://192.168.105.161:5432/test_hs_oracle";
            conn = DriverManager.getConnection(dbURL, "lightdb", "1");
            //Thread.sleep(50000);
            conn.setAutoCommit(false); //NOTE: 为了设置fetchSize,必须设置为false
            // 语句
            stmt = conn.createStatement();
            stmt.setFetchSize(1);
            System.out.println("ps.getQueryTimeout():" + stmt.getQueryTimeout());
            System.out.println("ps.getFetchSize():" + stmt.getFetchSize());
            System.out.println("ps.getFetchDirection():" + stmt.getFetchDirection());
            System.out.println("ps.getMaxFieldSize():" + stmt.getMaxFieldSize());
            // 查询
            //rs = stmt.executeQuery("set lightdb_cursor_after_commit to on");
            //rs = stmt.executeQuery("set lightdb_syntax_compatible_type to oracle");
            ResultSet resultSet = stmt.executeQuery("SELECT pg_backend_pid()");

            rs = stmt.executeQuery("SELECT * FROM nested_tab;");
            while(rs.next()){
                System.out.println(rs.getObject(1));
                conn.commit();
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
            e.printStackTrace();
        }finally {
            try {
                if(rs != null){
                    rs.close();
                }
            } catch (SQLException e) {
                System.err.println(e.getMessage());
                e.printStackTrace();
            }
            try {
                if(stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
                System.err.println(e.getMessage());
                e.printStackTrace();
            }
            try {
                if(conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                System.err.println(e.getMessage());
                e.printStackTrace();
            }
        }
    }

}

–lightdb_cursor_after_commit 设置成 off
test1
–lightdb_cursor_after_commit 设置成 on

test2

针对for update和for share测试

set lightdb_cursor_after_commit to on

for update

create table nested_tab(id int primary key, name varchar2(100), job varchar2(100), age int);
insert into nested_tab values (1, 'asda', 'gfdgd', 12);
insert into nested_tab values (2, 'sdfsd', 'cvxvx', 14);
insert into nested_tab values (3, 'uyiy', 'mmbv', 16);

create  or replace function fg(ref inout refcursor) return int as
begin             
open ref for select * from nested_tab for update;
return 0;
end;
/

lightdb@test_hs_oracle=#  begin;
BEGIN
lightdb@test_hs_oracle=*# select fg('cf');
 fg 
----
  0
(1 row)

lightdb@test_hs_oracle=*# fetch all in cf;
 id | name  |  job  | age 
----+-------+-------+-----
  1 | asda  | gfdgd |  12
  2 | sdfsd | cvxvx |  14
  3 | uyiy  | mmbv  |  16
(3 rows)

lightdb@test_hs_oracle=*# commit;
COMMIT
lightdb@test_hs_oracle=# fetch all in cf;
 id | name | job | age 
----+------+-----+-----
(0 rows)

lightdb@test_hs_oracle=# fetch all in cf;
ERROR:  cursor "cf" does not exist

test5

for share

create  or replace function fg(ref inout refcursor) return int as
begin             
open ref for select * from nested_tab for share;
return 0;
end;
/

lightdb@test_hs_oracle=# begin;
BEGIN
lightdb@test_hs_oracle=*# select fg('cf');
 fg 
----
  0
(1 row)

lightdb@test_hs_oracle=*# fetch all in cf;
 id | name  |  job  | age 
----+-------+-------+-----
  1 | asda  | gfdgd |  12
  2 | sdfsd | cvxvx |  14
  3 | uyiy  | mmbv  |  16
(3 rows)

lightdb@test_hs_oracle=*#  commit;
COMMIT
lightdb@test_hs_oracle=# fetch all in cf;
 id | name | job | age 
----+------+-----+-----
(0 rows)

lightdb@test_hs_oracle=# fetch all in cf;
ERROR:  cursor "cf" does not exist

test7

分布式测试

lightdb分布式参照:分布式

set lightdb_cursor_after_commit to off

create table nested_tab(id int primary key, name varchar2(100), job varchar2(100), age int);
insert into nested_tab values (1, 'asda', 'gfdgd', 12);
insert into nested_tab values (2, 'sdfsd', 'cvxvx', 14);
insert into nested_tab values (3, 'uyiy', 'mmbv', 16);

select create_distributed_table('nested_tab','id');

create function fg(ref inout refcursor) return int as
begin             
open ref for select * from nested_tab;
return 0;
end;
/
lightdb@test_hs_oracle=# begin;
BEGIN
lightdb@test_hs_oracle=*# select fg('cf');
 fg 
----
  0
(1 row)

lightdb@test_hs_oracle=*# fetch all in cf;
 id | name  |  job  | age 
----+-------+-------+-----
  1 | asda  | gfdgd |  12
  3 | uyiy  | mmbv  |  16
  2 | sdfsd | cvxvx |  14
(3 rows)

lightdb@test_hs_oracle=*# commit;
COMMIT
lightdb@test_hs_oracle=# fetch all in cf;
ERROR:  cursor "cf" does not exist

test3

set lightdb_cursor_after_commit to on

create table nested_tab(id int primary key, name varchar2(100), job varchar2(100), age int);
insert into nested_tab values (1, 'asda', 'gfdgd', 12);
insert into nested_tab values (2, 'sdfsd', 'cvxvx', 14);
insert into nested_tab values (3, 'uyiy', 'mmbv', 16);

select create_distributed_table('nested_tab','id');

create function fg(ref inout refcursor) return int as
begin             
open ref for select * from nested_tab;
return 0;
end;
/

lightdb@test_hs_oracle=# begin;
BEGIN
lightdb@test_hs_oracle=*# select fg('cf');
 fg 
----
  0
(1 row)

lightdb@test_hs_oracle=*# fetch all in cf;
 id | name  |  job  | age 
----+-------+-------+-----
  1 | asda  | gfdgd |  12
  3 | uyiy  | mmbv  |  16
  2 | sdfsd | cvxvx |  14
(3 rows)

lightdb@test_hs_oracle=*# commit;
COMMIT

lightdb@test_hs_oracle=# fetch all in cf;
 id | name | job | age 
----+------+-----+-----
(0 rows)

lightdb@test_hs_oracle=# fetch all in cf;
ERROR:  cursor "cf" does not exist

tesst4

for update/for share

create  or replace function fg(ref inout refcursor) return int as
begin             
open ref for select * from nested_tab for update;
return 0;
end;
/
lightdb@test_hs_oracle=# create  or replace function fg(ref inout refcursor) return int as
lightdb@test_hs_oracle$# begin             
lightdb@test_hs_oracle$# open ref for select * from nested_tab for update;
lightdb@test_hs_oracle$# return 0;
lightdb@test_hs_oracle$# end;
lightdb@test_hs_oracle$# /
CREATE FUNCTION
lightdb@test_hs_oracle=# begin;
BEGIN
lightdb@test_hs_oracle=*# select fg('cf');
ERROR:  could not run distributed query with FOR UPDATE/SHARE commands
HINT:  Consider using an equality filter on the distributed table's partition column.
CONTEXT:  SQL statement "select * from nested_tab for update"
PL/oraSQL function fg(refcursor) line 3 at OPEN

test5

总结

set lightdb_cursor_after_commit to on;在同一个会话中的后续事务中还能够继续访问该游标( 但是如果创建事务被中止,游标会被移除)。对于for update和for share lightdb_cursor_after_commit 参数使能单机模式还是支持的,分布式模式下由于不支持for update和for share直接报错。java端同理。
参见:declare

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP 排序函数使用方法,按照字母排序等操作

详解PHP排序方法使用 一、sort() 函数 用于对数组单元从低到高进行排序。 //数组 $data array(D,F,A,C,B); //排序 sort($data); //输出排版标签 echo "<pre>"; //打印数据 print_r($data);die;输出结果&#xff1a; 二、rsort() 函数 用于对数组单元从高到…

得帆信息副总裁——孔金:低代码在医药行业的应用实践

医药行业作为国计民生的重点行业之一&#xff0c;受到法律法规的严格监管&#xff0c;其信息化程度普遍较高&#xff0c;也是较早通过ERP&#xff08;企业资源管理系统&#xff09;、WMS&#xff08;仓储管理系统&#xff09;、TMS&#xff08;物流管理系统&#xff09;、MES&a…

linux 系统资源命令

系统资源命令 当前系统负载 w查看的是整体的负载&#xff0c;可以来观察当前系统有没有压力 w 系统当前负载 第一行显示的内容依次为&#xff1a;时间、系统运行时间、登录用户数、平均负载(1分钟、5分钟、15分钟) 第二行后展示的信息为&#xff1a;当前登录的都有哪些用户、在…

来学Python啦,大话字符串

To be a happy man&#xff0c; reading&#xff0c; travel&#xff0c; hard work&#xff0c; care for the body and mind。做一个幸福的人&#xff0c;读书&#xff0c;旅行&#xff0c;努力工作&#xff0c;关心身体和心境。 前面我们讲解过关于用Python写温度转换器&…

列表和字典练习

定义四个学生信息 在Python环境下&#xff0c;用列表定义&#xff1a; >>> stu1[xiaoming,True,21,79.9] >>> stu1[lihong,False,22,69.9] >>> stu1[zhangqiang,True,20,89.9] >>> stu1[EMT,True,23,99.9]如图&#xff0c;定义了四个列表…

【MySQL系列】视图特性

「前言」文章内容大致是MySQL事务管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 视图1.1 视图概念1.2 创建视图1.3 修改互相影响1.4 删除视图1.5 视图规则和限制 视图 1.1 视图概念 视图是一个虚拟表&#xff0c;其内容由查询定义同真实的表一样…

Python 之 numpy.unique函数的介绍以及使用

文章目录 介绍语法&#xff1a;返回值&#xff1a;示例&#xff1a;补充[1] 介绍 np.unique 是 NumPy 库中的一个函数&#xff0c;用于从数组中获取唯一的值&#xff0c;并且可以返回这些唯一值的一些相关信息。以下是对 np.unique 函数的详细介绍&#xff1a; 语法&#xff…

A6120 Emerson 机箱地震振动监测器

A6120 Emerson 机箱地震振动监测器 艾默生过程管理公司宣布&#xff0c;PlantWeb数字工厂架构已经安装在化学工业CATCH(技术能力评估中心)培训中心&#xff0c;该中心位于北林肯郡格里姆斯比附近的Stallingborough。这座价值820万英镑的设施是为了满足行业对培训中心的需求而开…

leetcode 523. 连续的子数组和

感谢小虎哥的解答 bool checkSubarraySum(vector<int>& nums, int k) {unordered_map<int, int> map; // 创建哈希表&#xff0c;用于存储累积和取模 k 的结果和对应的下标map[0] -1; // 初始化哈希表&#xff0c;0 对应的下标为 -1&#xff0c;用于处理从…

周赛362(差分数组、脑经急转弯、全排列、矩阵快速幂优化DP)

文章目录 周赛362[2848. 与车相交的点](https://leetcode.cn/problems/points-that-intersect-with-cars/)差分数组 [2849. 判断能否在给定时间到达单元格](https://leetcode.cn/problems/determine-if-a-cell-is-reachable-at-a-given-time/)脑经急转弯 [2850. 将石头分散到网…

7米层高建筑模板施工方案

在高层建筑的施工中&#xff0c;7米层高是一个常见的高度要求。为了确保施工的高效性和安全性&#xff0c;制定一套合理的7米层高模板施工方案至关重要。本文将就7米层高模板施工方案进行探讨&#xff0c;包括模板选择、搭建流程和安全措施等方面。 首先&#xff0c;模板的选择…

产品经理需要熟悉的网站

产品经理需要熟悉的网站 一、SAAS平台的聚合二、saas产品教程三、原型参考教程四、在线文档协作五、云笔记六、脑图&流程图 一、SAAS平台的聚合 作用&#xff1a;面试和工作的需要&#xff0c;方便各行业产品查找竞品。 网址&#xff1a;https://www.zhaosaas.com/&#x…

运行java命令出现 Error: Invalid or corrupt jarfile XXX.jar

朋友 我当你一秒朋友 朋友 我当你一世朋友 奇怪 过去再不堪回首 怀缅 时时其实还有 运行java命令出现 Error: Invalid or corrupt jarfile XXX.jar 基本可以断定&#xff0c;是jar不完整导致的。不完整&#xff01;&#xff01;&#xff01;记住关键字 检查1&#xff1a; …

如何统计iOS产品不同渠道的下载量?

一、前言 在开发过程中&#xff0c;Android可能会打出来很多的包&#xff0c;用于标识不同的商店下载量。原来觉得苹果只有一个商店&#xff1a;AppStore&#xff0c;如何做出不同来源的统计呢&#xff1f;本篇文章就是告诉大家如何做不同渠道来源统计。 二、正文 先看一下苹…

注册法国商标的步骤和时间

注册法国商标的步骤如下&#xff1a; 1、商标查询&#xff1a;在提交申请之前&#xff0c;建议进行商标查询&#xff0c;以确保商标在法国市场上具有独特性和显著性。 2、提交申请&#xff1a;通过法国知识产权局的在线平台提交商标申请。申请时&#xff0c;需要提供以下文件…

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…

SQLite3 操作命令以及c/c++编程API和例子

文章目录 数据库系统SQLiteSQLite数据类型SQLite语句介绍表的创建和查看表的删除插入和修改表数据的删除复制表和修改表结构事务处理函数操作数据分组group by约束联结表视图view触发器trigger日志操作索引 index SQLite c/c编程sqlite3_opensqlite3_closesqlite3_execsqlite3_…

华为云云服务器云耀L实例评测 | 华为云耀L实例:中小企业的最佳选择?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

地震反演基础知识2(代码演示)

文章目录 数据集代码演示1. SEG盐真实数据2. SEG盐速度模型3. SEG盐模拟地震数据4. SEG盐模拟速度模型5. openfwi地震数据6. openfwi速度模型 数据集代码演示 1. SEG盐真实数据 # 绘制SEG盐层数据的地震图像 def pain_seg_seismic_data(para_seismic_data):Plotting seismic …

第69步 时间序列建模实战:ARIMA建模(R)

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用R进行SARIMA模型的构建。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Re…