0

我问过:如何通过 keepalive postgreSQL 中断 TCP/IP 连接而不更改寄存器中的任何内容?

现在,我想确认:

我的系统(C#.NET、NHibernate 和 Active Record)使用数据库 PostgreSQL 8.4 和 Windows Server 运行。我需要一种方法来中断空闲或丢失的 TCP/IP 连接并解锁数据。

我无法调整操作系统配置,也无法重新编译 PostgreSQL。如果需要,我的系统可以在 Oracle 10g Express 中运行!我需要知道:我可以在不为 PostgreSQL 实施新补丁的情况下中断空闲连接吗?我需要为此将我的数据库迁移到 Oracle 吗?

谢谢,

4

2 回答 2

1

您正在寻找 pg_cancel_backend() 或 pg_terminate_backend() 吗?

检查http://www.postgresql.org/docs/current/static/functions-admin.html

于 2010-07-30T20:15:08.507 回答
1

如果有办法强制每个新连接在连接时执行查询,您可以编写一个数据库函数,为符合某些条件的任何进程动态调用“pg_terminate_backend(pid)”。在不知道您的设置的情况下,一些可能性是:

  • current_query = 'in transaction' 和 CURRENT_TIMESTAMP 的连接 - query_start() 大于某个值(1 分钟?5 分钟?)
  • 您当前未使用的来自您的 IP 地址或个人用户名(如果存在)的连接(但在连接池环境中可能不是一个好主意)

就个人而言,我会尝试重构,以尽量减少任何交易可能打开的时间。在某些地方,您可能会不必要地打开交易,从而增加触发问题的机会:

  • ORM 在 AutoCommit 关闭的情况下运行。
  • 为编辑屏幕读取数据时会执行 LOCK,因此在写回数据之前无法更新数据。在回信之前验证没有冲突是可以接受的。
  • 事务在非数据库任务(如 FTP 或电子邮件进程)之前开始,然后在之后关闭。
  • 第一个语句是没有锁定子句的 SELECT 的事务(如“FOR UPDATE”)。这个 SELECT 的结果无论是在事务内部还是事务外部都是一样的,因此它表明事务启动得太早并且可以缩短。
  • 仅包含任何一种语句的事务。
于 2010-07-30T20:32:15.790 回答