Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
Postgresql 事务在执行后保持pg_stat_活动状态_Postgresql_Go_Gorp - Fatal编程技术网

Postgresql 事务在执行后保持pg_stat_活动状态

Postgresql 事务在执行后保持pg_stat_活动状态,postgresql,go,gorp,Postgresql,Go,Gorp,我对PostgreSQL和golang都是新手。我主要是想了解以下几点: 为什么我需要Commit语句来关闭连接,而另外两个close调用没有做到这一点 同时,我也希望您能给我指点一下如何正确/错误地使用游标 在下面的函数中,我使用gorp创建一个游标,逐行查询我的Postgres DB,并将每一行写入一个writer函数: func(txn *gorp.Transaction, q string, params []interface{}, myWrit

我对PostgreSQL和golang都是新手。我主要是想了解以下几点:

  • 为什么我需要Commit语句来关闭连接,而另外两个
    close
    调用没有做到这一点
  • 同时,我也希望您能给我指点一下如何正确/错误地使用游标

在下面的函数中,我使用
gorp
创建一个游标,逐行查询我的Postgres DB,并将每一行写入一个writer函数:

func(txn *gorp.Transaction, 
     q string,
     params []interface{}, 
     myWriter func([]byte, error)) {

    cursor := "DECLARE GRABDATA NO SCROLL CURSOR FOR " + q
    _, err := txn.Exec(cursor, params...)
    if err != nil {
        myWriter(nil, err)
        return
    }

    rows, err := txn.Query("FETCH ALL in GRABDATA")
    if err != nil {
        myWriter(nil, err)
        return
    }

    defer func() {
        if _, err := txn.Exec("CLOSE GRABDATA"); err != nil {
            fmt.Println("Error while closing cursor:", err)
        }
        if err = rows.Close(); err != nil {
            fmt.Println("Error while closing rows:", err)
        } else {
            fmt.Println("\n\n\n Closed rows without error", "\n\n\n")
        }
        if err = txn.Commit(); err != nil {
            fmt.Println("Error on commit:", err)
        }
    }()

    pointers := make([]interface{}, len(cols))
    container := make([]sql.NullString, len(cols))
    values := make([]string, len(cols))
    for i := range pointers {
        pointers[i] = &container[i]
    }

    for rows.Next() {
        if err = rows.Scan(pointers...); err != nil {
            myWriter(nil, err)
            return
        }

        stringLine := strings.Join(values, ",") + "\n"
        myWriter([]byte(stringLine), nil)
    }
}
延迟
部分中,我最初只会
关闭
,但随后我看到
pg_statu_activity
空闲事务
状态下保持打开状态,并使用
获取所有的抓取数据
查询

调用
txn.Exec(“关闭”)
没有帮助。在那之后,我在事务中的空闲状态下进行了一次
closegrabdata
查询


只有当我开始调用
Commit()
时,连接才真正关闭。我想也许我需要调用Commit来执行事务上的任何操作,但如果是这样的话——为什么我没有调用它就得到了查询结果?

您想要结束事务,而不是关闭声明的游标<代码>提交
完成。 -这就是为什么您看到结果而不提交


pg_stat_activity.state
值为:
active
当您运行语句时(例如,
begin transaction;
fetch cursos
),
在事务中空闲
当您当前未运行语句时,但事务仍处于开始状态,最后是
idle
,运行
end
commit
后,事务结束。断开连接后,会话结束,并且在
pg_stat_activity
中根本没有行…

您希望结束事务,而不是关闭已声明的游标<代码>提交完成。 -这就是为什么您看到结果而不提交


pg_stat_activity.state
值为:
active
当您运行语句时(例如,
begin transaction;
fetch cursos
),
在事务中空闲
当您当前未运行语句时,但事务仍处于开始状态,最后是
idle
,运行
end
commit
后,事务结束。断开连接后,会话结束,并且
pg\u stat\u activity
中根本没有行…

您要结束事务,而不是关闭已声明的游标或成员以检查行。错误您要结束事务,而不是关闭已声明的游标或成员以检查行。错误感谢您的说明。如果我
commit
事务,是否仍应关闭声明的游标和
行。close()
<默认情况下,code>不带挂起,因此如果您没有明确定义,否则-提交时光标将丢失,是的,感谢您的澄清。如果我
commit
事务,是否仍应关闭声明的游标和
行。close()
<默认情况下,“代码>不带保留”,所以如果您没有明确定义其他选项,则提交时光标将丢失,是的