如题,主管交代的任务,请各位大神指教!

解决方案 »

  1.   

    是MYSQL?
    mysql -uroot -p123 -N -e "show full processlist ">r:\temp\123.txt
    分析123.txt
      

  2.   

    用指令的话我知道,我的意思是这样的,现在又个Web页面,数据库是PostgreSQL,因为我们后台数据非常庞大,一个用户在点击某个页面之后会去后台读库,有的时候数据量就非常大,时间比较长,这个时候用户可能不耐心,就将这个窗口关掉了,但是后台的查询仍然在进行,这样就严重影响了连接池的使用,现在的想法是:在这个页面打开时给页面添加一个ID使其与其连接数据库的PID对应起来,这样当这个用户关闭这个页面的时候,我们就直接干掉这个PID,所以是希望能从JDBC中直接获得(用Java)当前连接的PID,然后保存起来,有办法吗?
    或者方案也可以,这个地方实在不懂
      

  3.   

    用指令的话我知道,我的意思是这样的,现在又个Web页面,数据库是PostgreSQL,因为我们后台数据非常庞大,一个用户在点击某个页面之后会去后台读库,有的时候数据量就非常大,时间比较长,这个时候用户可能不耐心,就将这个窗口关掉了,但是后台的查询仍然在进行,这样就严重影响了连接池的使用,现在的想法是:在这个页面打开时给页面添加一个ID使其与其连接数据库的PID对应起来,这样当这个用户关闭这个页面的时候,我们就直接干掉这个PID,所以是希望能从JDBC中直接获得(用Java)当前连接的PID,然后保存起来,有办法吗?
    或者方案也可以,这个地方实在不懂 
      

  4.   

    看看能否满足
    SELECT * FROM pg_stat_activity
      

  5.   

    这个可以看到PID,但是不知道怎么将这个PID和当前登录的用户结合起来?
      

  6.   

    里面的USERNAME不行?
    SELECT * FROM pg_user;
      

  7.   

    参考
    http://www.php100.com/manual/PostgreSQL8/monitoring-stats.html
      

  8.   

    OR
    select * from pg_roles;
      

  9.   

    大哥,你给的这些内容很好,但是这些都是用户连接完成之后查表得到的信息,而现在最好是能够在建立连接的同时就得到这个PID,这样就有了一个一一对应的关系,而如果用查到的数据进行配对的话准确性会比较差!
      

  10.   

    不可以吗?用户登录->取得登录名保存->如果登录成功,通过 SELECT * FROM pg_stat_activity根据登录名 查找PID。
      

  11.   

      准确PID必须在数据库中取得
      

  12.   

    是Web和数据库的交互,所有登录的都是相同的用户名,这样根本无法区分前台刷新页面读库的用户是哪个PID
      

  13.   

    从语言代码无法得到,测试 了一下,即使用户名一致,
    从 SELECT * FROM pg_stat_activity
    中 得到procpid,区分不同的PID。如果你的版本是8.4以上SELECT 
        pg_terminate_backend(你要删除的procpid) 
    FROM 
        pg_stat_activity 
    WHERE 
       
        procpid <> pg_backend_pid()
      

  14.   

    现在就是无法得到准确的那个PID,不知道用户对应了哪个PID?
      

  15.   

    用户登录后,通过SELECT * FROM pg_stat_activity
    取得procpid,这个是唯一的,即使用户重复,你测试一下,我是测试通过的。
      

  16.   

    用户登录->取得PROCID,这个是唯一的(SELECT pg_backend_pid()取得)保存(用1个表保存)->用
    SELECT 
         pg_terminate_backend(你要删除的procpid) 
     FROM 
         pg_stat_activity 
     WHERE 
        
         procpid <> pg_backend_pid()
    KILL有问题的连接
      

  17.   

    大哥可能你没有理解我的意思,这个是个WEB,同一时间可能有很多用户同时连接上,但是在数据库中显示他们的username都是一样的,我如何去区分呢?
    我现在找到这个PID了,以Debug模式下看到的,但是无法在程序中得到,因为Connection接口没有实现这个方法
      

  18.   

    呵呵,由于用户名相同,你需要用1个表保存登录时间及相应的procpid,这个需要在你的语言中代码保存procpid(SELECT pg_backend_pid()取得),在数据库中的表中保存
    用户登录->取得PROCID,这个是唯一的(SELECT pg_backend_pid()取得)保存(用1个表保存)->用
     SELECT 
          pg_terminate_backend(你要删除的procpid) 
      FROM 
          pg_stat_activity 
      WHERE 
         
          procpid <> pg_backend_pid()
     KILL有问题的连接
      

  19.   

    select pg_backend_pid()是可以得到当前会话要用的pid。但是,我看到你说的方案:
    现在的想法是:在这个页面打开时给页面添加一个ID使其与其连接数据库的PID对应起来,这样当这个用户关闭这个页面的时候,我们就直接干掉这个PID,所以是希望能从JDBC中直接获得(用Java)当前连接的PID,然后保存起来,有办法吗?这样关闭页面导致你说的强行杀掉进程,会很快让连接池变得不可用。既然提到连接池,可以加入pgbouncer,它作为中间层,可以配置成transaction级别的,要吧降低连接进程的消耗。
      

  20.   

    我们用的连接池是C3P0,打算是将它的源码修改下,打开PID的接口,然后处理这个PID,这样处理这个PID还会影响连接池吗?
      

  21.   

    SELECT pg_backend_pid()得到的是哪个PID?是这个connection的吗?还是说所有连接到数据库的进程中最近的那个PID?
      

  22.   


    C3P0只是java JDBC连接池。PG数据库有一个中间层连接池,那个是动态要扩展的。相当于代理层:pgbouncer.
    外边再用C3P0是可以的。性能也会好一些。 一个jdbc物理连接,对应一个pgbouncer代理连接,多个此类连接对应一个pg客户端进程。总之,用这个杀死PID的方法,只要用户多关几个页面,你说的连接池里的连接对应的进程可能都被干掉了。最终连接池也会不起作用。这不是解决问题的根本方法。
      

  23.   

    你直接kill掉这个pid了,那个连接对应的物理进程都已经不存在了,连接池中的连接已经变成死连接了。怎么会复用。到时候会出错的。
      

  24.   

    pg_backend_pid() 获取当前连接的进程号pg_terminate_backend(procpid)是杀死这个连接
    pg_cancel_backend(procpid)是终止这个连接正在运行的命令所以你应该用pg_cancel_backend