Question

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. Alors je prie pour l'aide d'ici.

Down et informations sale:
Utilisation d'Oracle 9.2.0.8.0
Hibernate3 la mise en œuvre de POJO avec annotations
Tomcat 6.0.16
Oracle pilotes 10.2.x
C3P0 connction fournisseur piscine

Dans mon persistence.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 est dépassée.

Était-ce utile?

La solution

Merci à la non Sequitor pour toute l'aide. J'ai ce travail et me dis que je vais mettre toutes les pièces ici pour référence ultérieure. Quelle que soit toutes les demandes sur la mise à niveau des pilotes et tout fonctionnerait, non de qui a fonctionné pour moi. En fin de compte que je devais mettre en place un « org.hibernate.usertype.UserType » Je l'ai appelé le même que tous les exemples sur le StringClobType Web. Sauf pour certaines importations j'ai utilisé l'exemple de En utilisant CLOBs / Blobs avec Oracle et Hibernate . En ce qui me concerne, ignorer la demande « attention ».

Il y avait un changement que je devais faire pour obtenir des fusions de travailler. Certaines des méthodes ont pas été appliquées dans l'échantillon de code fourni. Eclipse pour moi fixé par les écrasant. Cool, mais la méthode remplacer doit être effectivement mis en œuvre ou toutes les fusions écrasera les données avec une valeur nulle. Voici mon implémentation:

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

Je ne vais pas faire double emploi avec la mise en œuvre de la classe ici aller sur le lien ci-dessus pour la voir. Je le code dans la troisième zone 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, pour utiliser la nouvelle UserType j'ai ajouté l'annotation à mon getter:

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

Je n'ai pas besoin de l'annotation @Lob.
Dans mon persistence.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 à la fin, il est sans doute préférable de rejoindre puis de se battre. Il m'a sauvé de trois jours.

Autres conseils

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

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

De plus, assurez-vous que vous utilisez la dernière Oracle 10g Release 2 pilote mince (10.2.0.4) ou version ultérieure.

Nous avons eu un problème similaire dans le passé, avec des colonnes de long au lieu de CLOBs. Le problème était le pilote JDBC, celui que nous utilisons maintenant et fonctionne très bien est

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top