有没有办法打破Windows Server 2008中PostgreSQL 8.4中丢失或空闲的连接TCP / IP?

时间:2010-07-30 18:45:49

标签: .net oracle postgresql tcp python-idle

我问过: How to break connections TCP/IP by keepalive postgreSQL without changing anything in the register?

现在,我想确认一下:

我的系统(C#.NET,NHibernate和Active Record)正在运行数据库PostgreSQL 8.4和Windows Server。我需要一种方法来打破空闲或丢失TCP / IP连接并取消阻止数据。

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

谢谢,

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

  • 在关闭AutoCommit的情况下运行ORM。
  • 在为编辑屏幕读取数据时会执行LOCK,因此在写回数据之前无法更新数据。在回写之前验证没有冲突可能是可以接受的。
  • 事务在非数据库任务(如FTP或电子邮件进程)之前启动,然后关闭。
  • 第一个语句是没有锁定子句的SELECT(如“FOR UPDATE”)的事务。无论是在交易内部还是在交易之外,此SELECT的结果都是相同的,因此它表明交易过早启动并且可以缩短。
  • 仅包含一种任何类型的陈述的交易。