programing

Oracle에서 최대 절전 모드: CLOB 열에 문자열 속성 매핑

padding 2023. 8. 1. 20:20
반응형

Oracle에서 최대 절전 모드: CLOB 열에 문자열 속성 매핑

경고: 아래에서 제 답변을 참조하십시오.이 문제는 10.2.0.4와 더불어 클래스 경로에 있는 이전 Oracle 드라이버로 인해 발생합니다.문제는 해결됐습니다.이 질문의 나머지를 후세에 남깁니다.

나는 다음과 같은 것들에 대해 머리를 부딪치고 있습니다.다음은 애플리케이션 코드에서 추출한 간단한 POJO입니다.

@Entity
@Table(name = "PIGGIES")
public class Piggy {    
    private Long id;
    private String description;

    public Piggy() {}

    @Id
    @GeneratedValue
    @Column(name = "PIGGY_ID")
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    @Lob
    @Column(name = "PIGGY_DESCRIPTION")
    public String getDescription() { return description; }
    public void setDescription(String d) { description = d; }
}

String 속성과 CLOB 열이 있습니다.내용이 짧을 때(예: "hello world") 잘 유지됩니다.문자열이 길면 다음과 같은 예외가 발생합니다.

java.sql.SQLException: operation not allowed: streams type cannot be used in batching
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
        at oracle.jdbc.driver.OraclePreparedStatement.addBatch(OraclePreparedStatement.java:4236)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.addBatch(DelegatingPreparedStatement.java:172)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.addBatch(DelegatingPreparedStatement.java:172)
        at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java:31)
        at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2403)

Oracle JDBC 드라이버 10.2.0.4에서 Hibernate 3.2.3을 사용하고 있습니다.예외 메시지는 배치에 문제가 있을 수 있음을 나타냅니다.이 간단한 경우 배치를 비활성화할 수 있지만 "실제" POJO에 대해 활성화해야 합니다.사실 현재 상태로는 쿼리 일괄 처리가 Hibernate를 사용하는 유일한 이유입니다.

그래서, 제 질문은, 어떻게 하면 위의 일을 할 수 있을까 하는 것입니다.

편집: 흥미로운 관찰: 제 "설명" 속성의 값은 정확하게 1333자 또는 더 짧은 한 그대로 유지됩니다.정말 이상한 숫자군요!

EDIT 2: 해결책을 찾기 위해 수정했습니다.getProperty()다음과 같은 주석을 사용할 수 있습니다.

@Lob
@Type(type="text")
@Column(name = "PIGGY_DESCRIPTION", length = Integer.MAX_VALUE)
public String getDescription() { return description; }

EDIT 3: "PIGGIES"의 DDL은 다음과 같습니다.

CREATE TABLE "PIGGIES" 
 (  "PIGGY_ID" NUMBER NOT NULL ENABLE, 
"PIGGY_DESCRIPTION" CLOB, 
 CONSTRAINT "PIGGIES_PK" PRIMARY KEY ("PIGGY_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "BBDATA"  ENABLE
 ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "BBDATA" 
LOB ("PIGGY_DESCRIPTION") STORE AS "SYS_LOB0000177753C00002$$"(
TABLESPACE "BBDATA" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10
NOCACHE 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)) ;

전체 스택은 다음과 같습니다.

org.hibernate.exception.GenericJDBCException: could not update: [com.bamnetworks.cms.types.Piggy#934]
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2425)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2307)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2607)
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
Caused by: java.sql.SQLException: operation not allowed: streams type cannot be used in batching
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
    at oracle.jdbc.driver.OraclePreparedStatement.addBatch(OraclePreparedStatement.java:4236)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.addBatch(DelegatingPreparedStatement.java:172)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.addBatch(DelegatingPreparedStatement.java:172)
    at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java:31)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2403)
    ... 45 more

바보 같은 경고: 알고 보니 수업 경로에 9가지 Oracle JDBC 수업이 있는 오래된 JAR이 있었습니다.이를 정리한 후 다음 주석만으로 모든 것이 마법처럼 작동했습니다.

@Lob
@Column(name = "PIGGY_DESCRIPTION")
public String getDescription() { return description; }

뚱뚱한 손가락을 탓하세요.

당신은 그것을 떨어뜨려 본 적이 있습니까?@Lob주석 및 주석을 사용하여 주석을 달기만 하면 됩니다.@Column제 경험으로는 CLOB의 열 유형을 최대 절전 모드로 지정할 필요가 없습니다. CLOB는 스스로 결정합니다.

배치 작업을 수행하는 클라이언트 코드의 일부를 포함할 수 있습니까?

언급URL : https://stackoverflow.com/questions/1644559/hibernate-on-oracle-mapping-string-property-to-clob-column

반응형