Hibernate> CLOB> Oracle :( - PullRequest
       30

Hibernate> CLOB> Oracle :(

4 голосов
/ 04 декабря 2009

Я пытаюсь записать в поле сгустка Oracle значение более 4000 символов. Это швы, чтобы быть общей проблемой, но ни одно из решений не работает. Поэтому я молюсь о помощи отсюда.

Вниз и грязная информация:
Использование Oracle 9.2.0.8.0
Hibernate3 реализует pojo с аннотациями
Tomcat 6.0.16
Драйверы Oracle 10.2.x
C3P0 поставщик пула соединений

В моем файле persistence.xml есть:

<persistence-unit name="DWEB" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.archive.autodetection" value="class"/> 
        <property name="hibernate.connection.password" value="###" />
        <property name="hibernate.connection.username" value="###" />
        <property name="hibernate.default_schema" value="schema" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test_period" value="3000" />
        <property name="show_sql" value="true" />
        <property name="format_sql" value="true" />
        <property name="use_sql_comments" value="true" />
        <property name="SetBigStringTryClob" value="true"/>
        <property name="hibernate.jdbc.batch_size" value="0"/>
        <property name="hibernate.connection.url" value="jdbc:oracle:thin:@server.ss.com:1521:DDD"/>
        <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
    </properties>
</persistence-unit>

Метод получения и установки выглядит так:

@Lob 
@Column(name="COMMENT_DOC")
public String getDocument(){
    return get("Document");
}
public void setDocument(String s){
    put("Document",s);
}

Исключение, которое я получаю:

SEVERE: Servlet.service() for servlet SW threw exception
java.sql.SQLException: Io exception: Software caused connection abort: socket write error
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:334)
    at oracle.jdbc.ttc7.TTC7Protocol.handleIOException(TTC7Protocol.java:3678)
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1999)
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1144)
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2152)
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2035)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2876)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:609)
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2275)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2688)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:304)
    at org.sw.website.actions.content.AddComment.performAction(AddComment.java:60)
...

Если мне нужно больше информации, спросите. Все работает, пока страшный предел не будет превышен.

Ответы [ 4 ]

4 голосов
/ 07 декабря 2009

Спасибо non sequitor за всю помощь. У меня есть эта работа, и я поставлю здесь все части для дальнейшего использования. Независимо от всех претензий по обновлению драйверов, и все будет работать, но это не сработало для меня. В конце концов мне пришлось реализовать 'org.hibernate.usertype.UserType', который я назвал так же, как и все примеры в сети StringClobType. За исключением некоторых импортов, я использовал пример из Использование Clobs / Blobs с Oracle и Hibernate . Насколько я могу судить, проигнорируйте претензию «остерегайтесь».

Было одно изменение, которое я должен был сделать, чтобы заставить работать слияния. Некоторые из методов не были реализованы в предоставленном примере кода. Затмение исправило это для меня, заглушив их. Круто, но метод замены должен быть фактически реализован, иначе все слияния перезапишут данные с нулем. Вот моя реализация:

public Object replace(Object newValue, Object existingValue, Object arg2)throws HibernateException {
    return newValue;
}

Я не буду дублировать реализацию класса, перейдите по ссылке выше, чтобы увидеть ее. Я использовал код в третьем сером поле. Затем в верхней части класса pojo, который я хотел использовать, я добавил следующее после импорта

...  
import org.hibernate.annotations.Type;  
import org.hibernate.annotations.TypeDefs;  
import org.hibernate.annotations.TypeDef;  

@TypeDefs({  
    @TypeDef(  
        name="clob",  
        typeClass = foo.StringClobType.class  
    )  
})  
@Entity  
@Table(name="EA_COMMENTS")  
public class Comment extends SWDataObject implements JSONString, Serializable {  
...  
}   

Затем, чтобы использовать новый UserType, я добавил аннотацию к своему получателю:

@Type(type="clob")
@Column(name="COMMENT_DOC")
public String getDocument(){
    return get("Document");
}

Мне не нужна аннотация @Lob.
В моем файле persistence.xml объявление модуля постоянства закончилось так:

<persistence-unit name="###" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.archive.autodetection" value="class"/> 
        <property name="hibernate.connection.password" value="###" />
        <property name="hibernate.connection.username" value="###" />
        <property name="hibernate.connection.url" value="jdbc:oracle:thin:@server.something.com:1521:###"/>
        <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
        <property name="hibernate.default_schema" value="###" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="100" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test period" value="3000" />
        <property name="hibernate.c3p0.idle_connection_test_period" value="300" />
        <property name="show_sql" value="false" />
        <property name="format_sql" value="false" />
        <property name="use_sql_comments" value="false" />
        <property name="hibernate.jdbc.batch_size" value="0"/>
    </properties>
</persistence-unit>

SetBigStringTryClob никогда не работал для меня и не требовался для этой окончательной реализации.

Мой урок, в конце концов, лучше присоединиться, чем сражаться. Это спасло бы меня три дня.

3 голосов
/ 25 января 2010

Должно быть:

<property name="hibernate.connection.SetBigStringTryClob">true</property>
<property name="hibernate.jdbc.batch_size">0</property>

А не:

<property name="SetBigStringTryClob">true</property>

И используйте правильный диалект для вашей базы данных (org.hibernate.dialect.Oracle9iDialect).

Также убедитесь, что вы используете последнюю версию Тонкий драйвер Oracle 10g Release 2 (10.2.0.4) или новее.

3 голосов
/ 04 декабря 2009

Я думаю, что ваша проблема может быть в том, что вы используете Oracle 9i , но диалект Hibernate 10g . Убедитесь, что ваш драйвер, версия БД и диалект все синхронизированы, потому что есть и диалект 9i org.hibernate.dialect.Oracle9iDialect

0 голосов
/ 04 декабря 2009

В прошлом у нас была похожая проблема с длинными столбцами вместо CLOB. Проблема была в драйвере JDBC, тот, который мы используем сейчас и работает нормально, это alt text

...