代码之家  ›  专栏  ›  技术社区  ›  user1671538

PostgreSQL 9.3长时间运行查询

  •  0
  • user1671538  · 技术社区  · 11 年前
     select vesseltrav0_.id as id1_0_, vesseltrav0_.created as created2_0_, vesseltrav0_.lastUpdated as lastUpda3_0_, vesseltrav0_.geoFenceId as geoFence4_0_, 
            vesseltrav0_.geoFenceName as geoFence5_0_, vesseltrav0_.mmsi as mmsi6_0_, vesseltrav0_.position as position7_0_, vesseltrav0_.timestamp as timestam8_0_, 
            vesseltrav0_.vesselEnteredTime as vesselEn9_0_, vesseltrav0_.vesselExitTime as vesselE10_0_, vesseltrav0_.vesselId as vesselI11_0_ 
     from VESSEL_ENTERED_GEOFENCE vesseltrav0_ where vesseltrav0_.geoFenceId=$1 and vesseltrav0_.vesselId=$2
    

    我有一个守护程序将记录记录到数据库中,并定期更新它们,但似乎每小时更新一次或两次,这种看起来相当无辜的SQL会拒绝完成。

    CREATE TABLE public.vessel_entered_geofence
    (
      id bigint NOT NULL,
      geofenceid character varying(36),
      geofencename character varying(128),
      mmsi character varying(32),
      vesselenteredtime timestamp without time zone,
      vesselexittime timestamp without time zone,
      vesselid character varying(36),
      created timestamp without time zone,
      lastupdated timestamp without time zone,
      "position" geometry(Point,4326),
      "timestamp" timestamp without time zone,
      CONSTRAINT vessel_entered_geofence_pkey PRIMARY KEY (id)
    )
    WITH (
      OIDS=FALSE
    );
    
    CREATE INDEX vessel_entered_geofence_idx
      ON public.vessel_entered_geofence
      USING btree
      (mmsi COLLATE pg_catalog."default");
    
    CREATE INDEX vessel_entered_geofence_gid_idx
    ON public.vessel_entered_geofence
    USING btree
    (geofenceid COLLATE pg_catalog."default");
    
    CREATE INDEX vessel_entered_geofence_vid_idx
    ON public.vessel_entered_geofence
    USING btree
    (vesselid COLLATE pg_catalog."default");
    

    当我在SQL上运行解释计划时,它使用的是索引,手动运行SQL会很快返回答案。所有连接都处于空闲状态(编辑:它们都是“事务中的空闲”),并且它们不等待任何东西(根据pg_stats_activity)。

    select * from pg_stat_activity order by backend_start
    

    enter image description here http://i.stack.imgur.com/0pp8X.png

    select a.*, b.relname from pg_locks a left outer join pg_class b on a.relation = b.oid
    

    enter image description here https://puu.sh/gGE9n/96da69d341.png

    我真的不知道下一步该去哪里确定问题是什么,他们似乎在闲着,不等待任何东西,桌子上没有锁会导致他们挂起来(除非我读错了)。如有任何帮助,将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  0
  •   user1671538    11 年前

    我想我终于解决了。Java代码中缺少begin/commit。

    entityManager.getTransaction().begin();
    //perform query
    entityManager.getTransaction().commit();
    

    即使查询只包含select语句,如果不将其封装在事务中,它也会挂起。