2009-12-03 5 views
4

Я пытаюсь написать в поле Oracle clob значение более 4000 символов. Эти швы - общая проблема, но не решения, похоже, работают. Поэтому я молюсь о помощи здесь.Hibernate> CLOB> Oracle :(

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

В моей в sistence.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) 
... 

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

+0

Исключение не похоже на CLOB. Возникает ли исключение при удалении CLOB? – Bozho

+0

Да, и это происходит только в том случае, если размер превышает 4000 – Mark

+0

Сегодня утром исключение отличается. Чаще всего сообщается java.sql.SQLException: больше нет данных для чтения из сокета \t на oracle.jdbc.dbaccess ... – Mark

ответ

4

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

Было одно изменение, которое мне пришлось внести, чтобы получить слияния для работы. Некоторые из методов не были реализованы в предоставленном образце кода. Eclipse исправил это для меня, удалив их. Прохладный, но метод замещения должен быть фактически реализован или все слияния будут перезаписывать данные с помощью null. Вот моя реализация:

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

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

... 
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"); 
} 

I не требуется аннотация @Lob.
В моей настойчивости.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 никогда не работал для меня, и не было необходимости для этой окончательной реализации.

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

+1

Похоже, что исходное сообщение ушло, только я мог найти, что он использовал архивы: http://web.archive.org/web/20090322003916/http://www.hibernate.org/56.html? –

+0

Да, вы должны опубликовать код, а не полагаться на ссылку, оригинал ушел. –

0

У нас была аналогичная проблема в прошлом, с столбцами LONG вместо CLOB. Проблема была драйвер JDBC, тот, который мы используем сейчас и работает штраф alt text http://img143.imageshack.us/img143/4263/20091204172213.png

+0

То, что мы используем для использования в качестве драйвера. – Mark

3

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

+0

Спасибо, началось с 9i, ​​но безрезультатно. Я вернулся и снова поставил 9i для двойной проверки. Все еще получалось то же исключение. – Mark

+0

Как насчет драйверов, которые все еще используют драйверы для 10g, когда вы используете 9i? Также вы можете опубликовать созданный sql? –

+0

Как вы можете определить, какие драйверы используются? Я использую последнюю версию ojbc14.jar с сайта oracle. Класс драйвера в файле persitence.xml - oracle.jdbc.driver.OracleDriver. Я выкопаю sql, который будет запущен и опубликует его. – Mark

3

Оно должно быть:

<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) или новее.

+1

Спасибо, это сработало для меня и было намного меньше работы :) – AHungerArtist

Смежные вопросы