2015-09-24 17 views
0
滯留

我目前運行的啓用PostGIS的,Postgres數據庫具有以下版本字符串:PostGIS的啓用的Postgres數據庫JDBC查詢中SQLException.setNextException

Version string PostgreSQL 9.4.1 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit 

我使用連接的JDBC驅動程序是

9.4-1201-jdbc41 

我運行下面的查詢:

SELECT * FROM foo; 

爲 '富' 的架構如下:

CREATE TABLE foo 
(
    gid integer NOT NULL DEFAULT nextval('address_gid_seq'::regclass), 
    objectid numeric(10,0), 
    house_num integer, 
    half_add character varying(4), 
    pre_dir character varying(2), 
    st_name character varying(50), 
    st_type character varying(4), 
    suf_dir character varying(2), 
    unit_type character varying(4), 
    unit_id character varying(6), 
    city character varying(15), 
    state character varying(2), 
    zipcode numeric(10,0), 
    angle numeric, 
    parcel_num character varying(11), 
    idnum numeric(10,0), 
    status character varying(1), 
    status_dat date, 
    esnnum character varying(5), 
    geom geometry(Point,3857), 
    CONSTRAINT address_pkey PRIMARY KEY (gid) 
) 

我沒有創建這個表,所以我不知道什麼可能出了紕漏,但行數(使用pgAdmin3快捷方式完成的)是〜250,000,所以demonstrably數據在那裏。要求通過「限制」獲得一些數據,儘管速度非常慢。

我可以暫停我在調試器中查詢,它停留在下面的堆棧:

PSQLWarning(SQLException).setNextException(SQLException) line: 294 
PSQLWarning(SQLWarning).setNextWarning(SQLWarning) line: 213  
Jdbc4ResultSet(AbstractJdbc2ResultSet).addWarning(SQLWarning) line: 2669  
AbstractJdbc2ResultSet$CursorResultHandler.handleWarning(SQLWarning) line: 1841 
QueryExecutorImpl$3.handleWarning(SQLWarning) line: 2179  
QueryExecutorImpl.processResults(ResultHandler, int) line: 2023 
QueryExecutorImpl.fetch(ResultCursor, ResultHandler, int) line: 2201  
Jdbc4ResultSet(AbstractJdbc2ResultSet).next() line: 1924  

我真的沒有很多時間來了解Postgres的JDBC驅動程序是如何實現的一切,所以我想我大聲呼喊,看看是否有其他人經歷過這種情況,以及表中的數據是否有問題。如果我有權訪問源數據,那麼我可能會爲此修復它;但是對現有Postgres表的查詢會導致似乎是無限循環,這似乎很奇怪。

我應該補充說,ResultSet.next()永遠不會在調試器中執行,代碼只能一直停留在setNextException()方法中。

編輯: 我得到噸這個在pgAdmin的 「消息」:

NOTICE: [g_serialized.c:gserialized_get_type:50] entered 
NOTICE: [lwgeom.c:lwgeom_set_srid:1455] entered with srid=3857 
NOTICE: [lwgeom.c:lwgeom_is_empty:1233] lwgeom_is_empty: got type Point 
NOTICE: [lwout_wkb.c:lwgeom_to_wkb:710] WKB output size: 25 
NOTICE: [lwout_wkb.c:lwgeom_to_wkb:723] Hex WKB output size: 51 
NOTICE: [lwgeom.c:lwgeom_is_empty:1233] lwgeom_is_empty: got type Point 
NOTICE: [lwout_wkb.c:lwpoint_to_wkb_buf:393] Entering function, buf = 0x2acec3c3e770 
NOTICE: [lwout_wkb.c:lwpoint_to_wkb_buf:395] Endian set, buf = 0x2acec3c3e772 
NOTICE: [lwout_wkb.c:integer_to_wkb_buf:189] Writing value '536870913' 
NOTICE: [lwout_wkb.c:lwpoint_to_wkb_buf:398] Type set, buf = 0x2acec3c3e77a 
NOTICE: [lwout_wkb.c:integer_to_wkb_buf:189] Writing value '3857' 
NOTICE: [lwout_wkb.c:lwpoint_to_wkb_buf:403] SRID set, buf = 0x2acec3c3e782 
NOTICE: [lwout_wkb.c:ptarray_to_wkb_buf:360] Writing point #0 
NOTICE: [lwout_wkb.c:ptarray_to_wkb_buf:364] Writing dimension #0 (buf = 0x2acec3c3e782) 
NOTICE: [lwout_wkb.c:ptarray_to_wkb_buf:364] Writing dimension #1 (buf = 0x2acec3c3e792) 
NOTICE: [lwout_wkb.c:ptarray_to_wkb_buf:369] Done (buf = 0x2acec3c3e7a2) 
NOTICE: [lwout_wkb.c:lwpoint_to_wkb_buf:407] Pointarray set, buf = 0x2acec3c3e7a2 
NOTICE: [lwout_wkb.c:lwgeom_to_wkb:759] buf (0x2acec3c3e7a3) - wkb_out (0x2acec3c3e770) = 51 
NOTICE: [g_serialized.c:gserialized_get_type:50] entered 
NOTICE: [g_serialized.c:lwgeom_from_gserialized:1137] Got type 1 (Point), srid=3857 
NOTICE: [g_serialized.c:lwgeom_from_gserialized_buffer:1091] Got type 1 (Point), hasz=0 hasm=0 geodetic=0 hasbox=0 

client_min_messages沒有顯示任何設置。

+2

通過250,000行循環不是無限的,但可能會覺得它! – e4c5

+1

它看起來像是一些東西必須在電線上發送*警告*或'通知'或類似消息。檢查'client_min_messages',看看你在PgAdmin或psql中運行它是否會得到很多消息。很難想象,自從一個簡單表中的'SELECT'應該不能運行任何可以發出通知的代碼。你確定*堆棧對應於該查詢嗎? –

回答

0

解決這個問題是因爲在評論中提到:

設置client_min_messagesERROR。這樣可以避免每個幾何記錄通過JDBC將十幾條錯誤消息發送到客戶端,這對我來說會提高至少一個數量級的性能。

相關問題