4

Oracleのclobフィールドに4000文字を超える値を書き込もうとしています。この継ぎ目は一般的な問題ですが、どの解決策も機能していないようです。ですから、ここからの助けを祈ります。

ダウンおよびダーティ情報: アノテーション付きのpojoを実装するOracle9.2.0.8.0Hibernate3の 使用
Tomcat6.0.16Oracle10.2.x ドライバー C3P0接続プールプロバイダー



私のpersistence.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)
...

私がより多くの情報を与える必要があるならば、お願いします。恐ろしい制限を超えるまで、すべてが機能します。

4

4 に答える 4

4

すべての助けをしてくれた non sequitor に感謝します。私はこれを機能させており、今後の参考のためにすべてのピースをここに置くつもりです. ドライバーのアップグレードに関するすべての主張に関係なく、すべてが機能しますが、それは私にとってはうまくいきませんでした。最後に、「org.hibernate.usertype.UserType」を実装する必要がありました。Web StringClobType のすべての例と同じ名前を付けました。いくつかのインポートを保存します。Using Clobs/Blobs with Oracle and Hibernate の例を使用しました。私に関する限り、「用心する」という主張は無視してください。

マージを機能させるには、1 つの変更を加える必要がありました。一部のメソッドは、提供されたコード サンプルでは実装されていません。Eclipseは、それらをスタブ化することで修正しました。クールですが、replace メソッドを実際に実装する必要があります。そうしないと、すべてのマージでデータが null で上書きされます。これが私の実装です:

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

ここではクラスの実装を複製しません。上記のリンクにアクセスして確認してください。3 番目の灰色のボックスのコードを使用しました。次に、使用したいpojoクラスの上部に、インポートの後に次を追加しました

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

@Lob アノテーションは必要ありませんでした。
私の persistence.xml では、persistence-unit 宣言は次のように終了しました。

<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 は私にとっては機能せず、この最終的な実装には必要ありませんでした。

私が学んだ教訓は、最終的には、戦うよりも参加するほうがよいということです。それは私を3日節約したでしょう。

于 2009-12-07T20:52:44.573 に答える
3

問題は、 Oracle 9iを使用しているが、Hibernate方言が10gである可能性があると思います。9i方言もあるので、ドライバー、dbバージョン、方言がすべて同期していることを確認してくださいorg.hibernate.dialect.Oracle9iDialect

于 2009-12-04T20:15:09.167 に答える
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 リリース 2 シン ドライバー(10.2.0.4) 以降を使用していることを確認してください。

于 2010-01-25T07:13:16.453 に答える
0

CLOB の代わりに LONG 列を使用して、過去に同様の問題がありました。問題は JDBC ドライバーでした。現在使用していて問題なく動作するのは、代替テキスト

于 2009-12-04T16:25:04.290 に答える