Hibernate > CLOB > Oracle :(
Ich versuche, mich zum schreiben in eine Oracle clob-Feld einen Wert über 4000 Zeichen. Diese Nähte werden ein häufiges Problem, aber keine der Lösungen zu funktionieren scheint. So bete ich auf Hilfe von hier.
Down and dirty info:
Mit Oracle 9.2.0.8.0
Hibernate3 Implementierung von pojo ' s mit Anmerkungen
Tomcat-6.0.16
Oracle 10.2.x-Treiber
C3P0 connction pool-Anbieter
In meinem persistence.xml ich habe:
<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>
Den getter-und setter sieht so aus:
@Lob
@Column(name="COMMENT_DOC")
public String getDocument(){
return get("Document");
}
public void setDocument(String s){
put("Document",s);
}
Ausnahme bin ich immer:
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)
...
Wenn ich brauche, um mehr info bitten bitten. Alles funktioniert, bis die gefürchtete Grenze überschritten wird.
die Ausnahme scheint nicht im Zusammenhang mit der CLOB. Gilt die Ausnahme auftreten, wenn Sie entfernen Sie die CLOB?
Ja, und es tritt nur auf, wenn die Größe über 4000
Heute morgen die Ausnahme ist anders. Es ist oft berichtet java.sql.SQLException: Keine weiteren Daten aus socket zu Lesen bei oracle.jdbc.dbaccess ...
Ja, und es tritt nur auf, wenn die Größe über 4000
Heute morgen die Ausnahme ist anders. Es ist oft berichtet java.sql.SQLException: Keine weiteren Daten aus socket zu Lesen bei oracle.jdbc.dbaccess ...
InformationsquelleAutor Mark | 2009-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank non sequitor für all die Hilfe. Ich habe diese Arbeit und das Bild ich werde alle Teile hier für die Zukunft auf. Unabhängig von all den Behauptungen über die Aktualisierung der Treiber und alles funktionieren würde, nicht der, der für mich gearbeitet. Am Ende musste ich zur Umsetzung ein " org.hibernate.usertype.UserType' ich benannte es das gleiche wie alle Beispiele auf der web-StringClobType. Speichern Sie für einige Importe benutzte ich das Beispiel von Verwenden von Clobs/Blobs mit Oracle und Hibernate. Soweit ich bin besorgt ignorieren die "Vorsicht" behaupten.
Gab es eine änderung, die ich machen musste, um zu bekommen, führt zu arbeiten. Einige der Methoden wurden nicht implementiert, im code-Beispiel. Eclipse fixiert es für mich von stubbing diese. Cool, aber die replace-Methode ersetzt werden muss, tatsächlich umgesetzt oder alles mischen überschreibt die Daten mit einer null. Hier ist meine Umsetzung:
Ich nicht doppelt die Klasse Umsetzung hier gehen Sie auf den obigen link, um es zu sehen. Ich benutzt den code in der Dritte grauen Kasten. Dann oben in der pojo-Klasse wollte ich es verwenden, ich habe Folgendes nach der Einfuhr
Dann die Verwendung der neuen UserType ich fügte die Anmerkung zu meinem getter:
Brauchte ich nicht die @Lob annotation.
In meinem persistence.xml die persistence-unit Erklärung endete auf der Suche wie:
Den SetBigStringTryClob nie für mich gearbeitet und war nicht notwendig für diese endgültige Umsetzung.
Meine Lektion gelernt, am Ende ist es wahrscheinlich besser, join dann zu kämpfen. Es würde gespeichert haben mich drei Tage.
Ja man soll nach dem code, anstatt verlassen sich auf den link, das original ist Weg.
InformationsquelleAutor Mark
Ich glaube, dein problem könnte sein, dass Sie mit Oracle 9i aber Hibernate-Dialekt ist 10g. Stellen Sie sicher, dass Ihre Treiber,die db-version und Dialekt sind alle synchron, weil es eine 9i-Dialekt als auch
org.hibernate.dialect.Oracle9iDialect
Was über die Treiber sind u noch mit Treibern für 10 G, wenn u verwenden 9i? Auch kannst du die generierte sql?
Wie können Sie sagen, welche Treiber verwendet werden? Ich verwende die neueste version von ojbc14.jar von der oracle-Website. Die Fahrer der Klasse in der persitence.xml ist oracle.jdbc.- Treiber.OracleDriver . Ich werde Graben, die sql laufen und poste es.
Dies ist die generierte sql von hibernate: insert into pweb60.EA_COMMENTS (GENEHMIGT, ARCHIVIERT, WEG, GELÖSCHT, COMMENT_DOC, FERTIG, MODERATED_BY, PARENT_COMMENT, TOPIC_ID, USER_ID, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Nach Ihnen, Sie sind mit "Oracle 10.2.x-Treiber" ich bin mir nicht ganz sicher, was das ist
InformationsquelleAutor non sequitor
Sollte es sein:
Und nicht:
Und verwenden Sie den richtigen Dialekt für Ihre Datenbank (
org.hibernate.dialect.Oracle9iDialect
).Stellen Sie außerdem sicher, dass Sie die neueste Oracle 10g Release 2 thin-Treiber (10.2.0.4) oder höher.
InformationsquelleAutor Pascal Thivent
Hatten wir ein ähnliches problem in der Vergangenheit, mit LANGEN Spalten anstelle von CLOBs. Das problem war, dass der JDBC-Treiber, den wir jetzt benutzen, und funktioniert gut, ist alt-text http://img143.imageshack.us/img143/4263/20091204172213.png
InformationsquelleAutor Lluis Martinez