我正在尝试将超过4000个字符的值写入Oracle clob字段。这种接缝是一个常见问题,但解决方案似乎不起作用。所以我从这里寻求帮助。
向下和脏信息:
使用Oracle 9.2.0.8.0
Hibernate3用注释实现pojo
Tomcat 6.0.16
Oracle 10.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>
getter和setter看起来像:
@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)
...
如果我需要提供更多信息请求。一切都有效,直到超过可怕的极限。
答案 0 :(得分:4)
感谢非sequitor的所有帮助。我有这个工作,并计算我将把所有的部分放在这里供将来参考。无论关于升级驱动程序的所有声明如何,一切都会起作用,不是那些对我有用。最后,我必须实现一个'org.hibernate.usertype.UserType',我将它命名为与Web StringClobType上的所有示例相同。除了一些导入,我使用了Using Clobs/Blobs with Oracle and Hibernate中的示例。就我而言,忽略了“提防”的主张。
我必须做出一项改变才能让合并工作。某些方法未在提供的代码示例中实现。 Eclipse通过将它们删除来为我修复它。很酷,但是需要实际实现replace方法,否则所有合并都会用null覆盖数据。这是我的实施:
public Object replace(Object newValue, Object existingValue, Object arg2)throws HibernateException {
return newValue;
}
我不会在这里复制类实现转到上面的链接看看。我在第三个灰色框中使用了代码。然后在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我将注释添加到我的getter:
@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从未对我有用,并且最终实现不需要。
我的经验教训最终可能更好的是加入战斗。它会救我三天。
答案 1 :(得分:3)
我认为您的问题可能是您正在使用 Oracle 9i ,但Hibernate方言 10g 。确保您的驱动程序,数据库版本和方言都是同步的,因为还有一个9i方言org.hibernate.dialect.Oracle9iDialect
答案 2 :(得分: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)或更高版本。
答案 3 :(得分:0)