从语言代码无法得到,测试 了一下,即使用户名一致, 从 SELECT * FROM pg_stat_activity 中 得到procpid,区分不同的PID。如果你的版本是8.4以上SELECT pg_terminate_backend(你要删除的procpid) FROM pg_stat_activity WHERE
procpid <> pg_backend_pid()
现在就是无法得到准确的那个PID,不知道用户对应了哪个PID?
用户登录后,通过SELECT * FROM pg_stat_activity 取得procpid,这个是唯一的,即使用户重复,你测试一下,我是测试通过的。
用户登录->取得PROCID,这个是唯一的(SELECT pg_backend_pid()取得)保存(用1个表保存)->用 SELECT pg_terminate_backend(你要删除的procpid) FROM pg_stat_activity WHERE
呵呵,由于用户名相同,你需要用1个表保存登录时间及相应的procpid,这个需要在你的语言中代码保存procpid(SELECT pg_backend_pid()取得),在数据库中的表中保存 用户登录->取得PROCID,这个是唯一的(SELECT pg_backend_pid()取得)保存(用1个表保存)->用 SELECT pg_terminate_backend(你要删除的procpid) FROM pg_stat_activity WHERE
mysql -uroot -p123 -N -e "show full processlist ">r:\temp\123.txt
分析123.txt
或者方案也可以,这个地方实在不懂
或者方案也可以,这个地方实在不懂
SELECT * FROM pg_stat_activity
SELECT * FROM pg_user;
http://www.php100.com/manual/PostgreSQL8/monitoring-stats.html
select * from pg_roles;
从 SELECT * FROM pg_stat_activity
中 得到procpid,区分不同的PID。如果你的版本是8.4以上SELECT
pg_terminate_backend(你要删除的procpid)
FROM
pg_stat_activity
WHERE
procpid <> pg_backend_pid()
取得procpid,这个是唯一的,即使用户重复,你测试一下,我是测试通过的。
SELECT
pg_terminate_backend(你要删除的procpid)
FROM
pg_stat_activity
WHERE
procpid <> pg_backend_pid()
KILL有问题的连接
我现在找到这个PID了,以Debug模式下看到的,但是无法在程序中得到,因为Connection接口没有实现这个方法
用户登录->取得PROCID,这个是唯一的(SELECT pg_backend_pid()取得)保存(用1个表保存)->用
SELECT
pg_terminate_backend(你要删除的procpid)
FROM
pg_stat_activity
WHERE
procpid <> pg_backend_pid()
KILL有问题的连接
现在的想法是:在这个页面打开时给页面添加一个ID使其与其连接数据库的PID对应起来,这样当这个用户关闭这个页面的时候,我们就直接干掉这个PID,所以是希望能从JDBC中直接获得(用Java)当前连接的PID,然后保存起来,有办法吗?这样关闭页面导致你说的强行杀掉进程,会很快让连接池变得不可用。既然提到连接池,可以加入pgbouncer,它作为中间层,可以配置成transaction级别的,要吧降低连接进程的消耗。
C3P0只是java JDBC连接池。PG数据库有一个中间层连接池,那个是动态要扩展的。相当于代理层:pgbouncer.
外边再用C3P0是可以的。性能也会好一些。 一个jdbc物理连接,对应一个pgbouncer代理连接,多个此类连接对应一个pg客户端进程。总之,用这个杀死PID的方法,只要用户多关几个页面,你说的连接池里的连接对应的进程可能都被干掉了。最终连接池也会不起作用。这不是解决问题的根本方法。
pg_cancel_backend(procpid)是终止这个连接正在运行的命令所以你应该用pg_cancel_backend