0

我得到SQl Exception ORA-13268: error obtaining dimension from USER_SDO_GEOM_METADATA。当我单独运行并执行大约 3 秒时,查询工作正常。但是,当我使用来自不同线程的 java(我正在使用 spring-mybatis)对同一点运行多个查询时,我会收到此错误。创建并执行该线程,以便每 3 秒有两个请求访问数据库。

当我分析我的 java 日志时,第一个请求需要 3 秒,随后的请求会随着执行查询所需的时间而增加 5,8,12,13,16,17,23,26,29,34,39,....很快。最后,当查询执行时间达到 100 秒时,我遇到了错误。完整的错误描述如下。

### Error querying database.  Cause: java.sql.SQLException: ORA-13268: error obtaining dimension from USER_SDO_GEOM_METADATA
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 8
ORA-06512: at "MDSYS.SDO_3GL", line 133

### The error may exist in file [/var/lib/tomcat6/webapps/kp/WEB-INF/classes/sqlmap/IKPMapper.xml]
### The error may involve com.kp.persistence.IKPMapper.getAddress-Inline
### The error occurred while setting parameters
### SQL: SELECT  A.BIN_ORDINATE,A.ADDRESS,A.HOUSE_OWNER, A.PIN_CODE FROM KP_GEOM_TBL A WHERE SDO_RELATE(A.BIN_ORDINATE,SDO_GEOMETRY(2001,3857,sdo_point_type(?,?,NULL),NULL,NULL),'mask=TOUCH+CONTAINS')='TRUE'
### Cause: java.sql.SQLException: ORA-13268: error obtaining dimension from USER_SDO_GEOM_METADATA
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 8
ORA-06512: at "MDSYS.SDO_3GL", line 133

; uncategorized SQLException for SQL []; SQL state [72000]; error code [13268]; ORA-13268: error obtaining dimension from USER_SDO_GEOM_METADATA
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 8
ORA-06512: at "MDSYS.SDO_3GL", line 133
; nested exception is java.sql.SQLException: ORA-13268: error obtaining dimension from USER_SDO_GEOM_METADATA
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 8
ORA-06512: at "MDSYS.SDO_3GL", line 133

最初我使用的是序列化隔离级别。由于我的数据不会改变,我将隔离级别更改为已提交读(因为 Oracle 仅支持这两个)。问题仍然没有变化。

这是我的 DDL

 INSERT INTO USER_SDO_GEOM_METADATA VALUES
  (
    'KP_GEOM_TBL',
    'BIN_ORDINATE',
    SDO_DIM_ARRAY( SDO_DIM_ELEMENT('Longitude', -180, 180, 0.05), 
    SDO_DIM_ELEMENT('Latitude', -90, 90, 0.05)    
    ),
    3857 -- SRID for 'Longitude / Latitude (WGS 84)' coordinate system
  );


  CREATE TABLE KP_GEOM_TBL
  (
    BIN_ORDINATE SDO_GEOMETRY NOT NULL ,
    ADDRESS     VARCHAR2(60 BYTE) NOT NULL ,
    HOUSE_OWNER VARCHAR2(60 BYTE) NOT NULL ,
    PIN_CODE      VARCHAR2(30 BYTE) NOT NULL 
  );


  CREATE INDEX KP_GEOM_IDX ON KP_GEOM_TBL (BIN_ORDINATE) INDEXTYPE IS MDSYS.SPATIAL_INDEX PARALLEL;

根据此处的此链接,我将查询更改如下

SELECT /*+ leading(A) use_nl_with_index(A KP_GEOM_IDX) */  A.BIN_ORDINATE,A.ADDRESS,A.HOUSE_OWNER, A.PIN_CODE FROM KP_GEOM_TBL A WHERE SDO_RELATE(A.BIN_ORDINATE,SDO_GEOMETRY(2001,3857,sdo_point_type(?,?,NULL),NULL,NULL),'mask=TOUCH+CONTAINS')='TRUE'

仍然没有运气。

甲骨文版本:11.2.0.3.0

3 秒的空间查询是否可以接受?

4

1 回答 1

0

它是由于表的创建方式。在create table我使用并行创建六度表。当我禁用它时no parallel,我面临的问题得到了解决。它是 oracle 版本的错误,已在以后的版本中修复。

create table KP_GEOM_TBL parallel(degree 6)

一旦我执行了下面的语句,问题就得到了解决,而且现在它只需要几个工厂来查询数据库,而以前它需要几秒钟。

ALTER TABLE KP_GEOM_TBL NOPARALLEL
于 2014-06-25T09:12:52.247 回答