Domanda

Sto cercando di scrivere in un campo CLOB Oracle un valore superiore a 4000 caratteri. Questo cuciture ad essere un problema comune, ma non delle soluzioni sembrano funzionare. Quindi io prego per aiuto da qui.

Giù e informazioni sporca:
Utilizzando Oracle 9.2.0.8.0
Hibernate3 implementazione POJO di con annotazioni
Tomcat 6.0.16
Oracle 10.2.x driver
C3P0 connction fornitore di piscina

Nel mio persistence.xml ho:

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

Il getter e setter appare come:

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

L'eccezione che sto ottenendo è:

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

Se ho bisogno di dare più informazioni suppliche chiedono. Tutto funziona fino a quando viene superato il limite temuta.

È stato utile?

Soluzione

Grazie a non sequitor per tutto l'aiuto. Ho questo lavoro e la figura farò mettere tutti i pezzi per riferimenti futuri. Indipendentemente da tutte le affermazioni circa l'aggiornamento dei driver e tutto avrebbe funzionato, non di che ha lavorato per me. Alla fine ho dovuto implementare un 'org.hibernate.usertype.UserType' ho chiamato lo stesso come tutti gli esempi sul StringClobType web. Salva per alcune importazioni ho usato l'esempio da Utilizzando CLOB / Blobs con Oracle e Hibernate . Per quanto mi riguarda ignorare il claim "attenti".

C'è stato un cambio ho dovuto fare per arrivare fonde al lavoro. Alcuni dei metodi non sono state attuate nel codice di esempio fornito. Eclipse ha risolto il tutto per me da loro spegnendo. Fresco, ma la sostituzione metodo deve essere effettivamente attuate o tutte merge sovrascrive i dati con un nullo. Qui è la mia realizzazione:

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

Non voglio duplicare l'implementazione della classe qui andare al link qui sopra per vederla. Ho usato il codice nella terza casella grigia. Poi al vertice della classe POJO ho voluto utilizzarlo in Ho aggiunto il seguente dopo le importazioni

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

Quindi per utilizzare il nuovo UserType ho aggiunto l'annotazione alla mia getter:

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

non ho avuto bisogno l'annotazione @Lob.
Nel mio persistence.xml la dichiarazione di persistenza unità finì guardando come:

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

Il SetBigStringTryClob mai funzionato per me e non era necessario per questa implementazione finale.

La mia lezione imparata è, alla fine, è probabilmente meglio per unirsi poi a combattere. Sarebbe Inviate salvato tre giorni.

Altri suggerimenti

Credo che il problema potrebbe essere che si sta utilizzando Oracle 9i , ma Hibernate dialetto è 10 g . Assicurarsi che il driver, versione del db e il dialetto sono tutti in sincronia perché c'è un dialetto 9i e org.hibernate.dialect.Oracle9iDialect

Dovrebbe essere:

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

E non:

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

E utilizzare il dialetto giusto per il database (org.hibernate.dialect.Oracle9iDialect).

Inoltre, assicurarsi che si sta utilizzando l'ultima Oracle 10g Release 2 conducente sottile (10.2.0.4) o versione successiva.

Abbiamo avuto un problema simile in passato, con colonne LONG invece di CLOB. Il problema era il driver JDBC, quello che usiamo ora e funziona bene è alt text

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top