2009-12-03 10 views
4

Je suis en train d'écrire sur un champ clob Oracle une valeur supérieure à 4000 caractères. Ce joints à un problème commun, mais non des solutions semblent fonctionner. Je prie pour l'aide d'ici.Mise en veille prolongée> CLOB> Oracle :(

vers le bas et les informations sale:
en utilisant Oracle 9.2.0.8.0
Hibernate3 la mise en œuvre de POJO avec des annotations
Tomcat 6.0.16
pilotes Oracle 10.2.x
C3P0 connction fournisseur piscine

Dans mon par sistence.xml Je:

<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> 

Le getter et setter ressemble:

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

L'exception que je reçois est:

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) 
... 

Si je dois donner plus de moyens d'information demandent . Tout fonctionne jusqu'à ce que la limite redoutée soit dépassée.

+0

l'exception ne semble pas liée à la CLOB. L'exception se produit-elle lorsque vous supprimez le CLOB? – Bozho

+0

Oui, et cela ne se produit que si la taille est supérieure à 4000 – Mark

+0

Ce matin l'exception est différente. C'est le plus souvent signalé java.sql.SQLException: Plus de données à lire à partir du socket \t at oracle.jdbc.dbaccess ... – Mark

Répondre

4

Merci à non séqueur pour toute l'aide. J'ai ce travail et figure que je vais mettre toutes les pièces ici pour référence future. Indépendamment de toutes les réclamations au sujet de la mise à niveau des conducteurs et tout fonctionnerait, non de cela a fonctionné pour moi. À la fin j'ai dû implémenter un 'org.hibernate.usertype.UserType' je l'ai appelé le même que tous les exemples sur le Web StringClobType. Enregistrer pour certaines importations j'ai utilisé l'exemple de Using Clobs/Blobs with Oracle and Hibernate. En ce qui me concerne, ne tenez pas compte de la réclamation "Méfiez-vous".

Il y avait un changement que je devais faire pour obtenir des fusions de travailler. Certaines méthodes n'ont pas été implémentées dans l'exemple de code fourni. Eclipse l'a fixé pour moi en les écrasant. Cool, mais la méthode de remplacement doit être réellement implémentée ou toutes les fusions écraseront les données avec une valeur nulle. Voici ma mise en œuvre:

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

Je ne vais pas dupliquer l'implémentation de la classe ici aller au lien ci-dessus pour le voir. J'ai utilisé le code dans la troisième case grise. Puis au sommet de la classe POJO je voulais l'utiliser dans j'ajouté, après les importations

... 
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 { 
... 
} 

ensuite d'utiliser la nouvelle UserType j'ai ajouté l'annotation à mon getter:

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

I n'a pas besoin de l'annotation @Lob.
Dans ma persistance.xml la déclaration persistance unité ressemblant clos le:

<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> 

Le SetBigStringTryClob n'a jamais travaillé pour moi et n'a pas été nécessaire pour cette mise en œuvre finale.

Ma leçon apprise est qu'à la fin il vaut probablement mieux se joindre puis se battre. Cela m'aurait sauvé trois jours.

+1

On dirait que le message original a disparu, seulement comme je l'ai trouvé en utilisant les archives: http://web.archive.org/web/20090322003916/http://www.hibernate.org/56.html? –

+0

Oui, vous devriez poster le code plutôt que de compter sur le lien, l'original est parti. –

3

Je pense que votre problème est peut-être que vous utilisez Oracle 9i mais mise en veille prolongée dialecte est 10g. Assurez-vous que votre pilote, la version db et le dialecte sont tous synchronisés car il y a un dialecte 9i ainsi org.hibernate.dialect.Oracle9iDialect

+0

Merci, a commencé avec le 9i mais en vain. Je suis retourné et mis à 9i à nouveau pour vérifier. Toujours obtenir la même exception. – Mark

+0

Qu'en est-il des pilotes qui utilisent encore des pilotes pour 10g lorsque vous utilisez 9i? Aussi pouvez-vous poster le sql généré? –

+0

Comment savoir quels pilotes sont utilisés? J'utilise la dernière version de ojbc14.jar depuis le site d'Oracle. La classe de pilote dans le fichier persitence.xml est oracle.jdbc.driver.OracleDriver. Je vais creuser le SQL en cours d'exécution et le poster. – Mark

3

Il devrait être:

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

Et pas:

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

Et utiliser le bon dialecte pour votre base de données (org.hibernate.dialect.Oracle9iDialect).

Vérifiez également que vous utilisez le pilote Oracle 10g Release 2 le plus récent (10.2.0.4) ou version ultérieure.

+1

Merci, cela a fonctionné pour moi et était beaucoup moins de travail :) – AHungerArtist