oracle clob问题

first friend:

最初的问题表象估计和大部分的情形差不多,报告 streams type cannot be used in batching 错误。

我用了 ImmutableType 方式,定义了StringClobType extends ImmutableType 如下:
java代码: 


public class StringClobType extends ImmutableType {
        public Object get(ResultSet rs, String name)
                throws HibernateException, SQLException {
                Clob clob = rs.getClob(name);
                if (clob==null) {
                    return "";
                }
                return clob.getSubString(1, (int) clob.length());
        }
        public void set(PreparedStatement st, Object value, int index)
                throws HibernateException,SQLException {
                StringReader r = new StringReader((String) value);
                st.setCharacterStream(index, r, ((String) value).length());
        }
        public int sqlType() {
                return Types.CLOB;
        }
        public String getName() {
                return "string";
        }
        public boolean hasNiceEquals() {
                return false;
        }
        public boolean equals(Object x, Object y) {
                return ObjectUtils.equals(x, y);
        }
        public String toXML(Object value) {
                return (String) value;
        }
        public Class getReturnedClass() {
                return Clob.class;
        }
        public Object fromStringValue(String xml) {
                throw new UnsupportedOperationException();
        }

        public String toString(Object value) {
                return value.toString();
        }
}



用这种方式处理小记录(小于4000字节)可以,但是当大字段的时候,总是报告streams type cannot be used in batching 。

网上查阅的大量资料,中文的,国外的,什么hibernate 56,73文档。包括在这个论坛进行了大范围的搜索。
最后尝试了两种方式,在配置文件中,指明 hibernate.jdbc.batch_size为0 ;或者 hibernate.jdbc.use_streams_for_binary为true。设置对于hibernate.jdbc.use_streams_for_binary 设置的时候,在jvm环境中设置了。

结果确实不出现streams type cannot be used in batching 错误,却报告flush错误。

可以说,我的存储很简单。采用了 extends ImmutableType 之后。而且,对所有的clob字段,在bo对象中采用String类型映射数据库的blob字段 一个
session.save(object); 就完成(当然省略了很多代码)。

网上也发现,采用下面的方式可行
java代码: 


Session s = sf.openSession();
tx = s.beginTransaction();
foo = new Foo();
foo.setClob( Hibernate.createClob(" ") );
s.save(foo);
s.flush();
s.refresh(foo, LockMode.UPGRADE); //grabs an Oracle CLOB
oracle.sql.CLOB clob = (oracle.sql.CLOB) foo.getClob();
java.io.Writer pw = clob.getCharacterOutputStream();
pw.write(content);
pw.close();
tx.commit();
s.close();



但这种方式,bo必须指明clob属性,而且一般情况下每个操作似乎都必须是单独的代码,有些费时。

不知道,这个问题,谁良好的解决了,能否详细的说明。

备注环境:
db: oralce9i
dbdriver: oracle.jdbc.sql.OracleDriver
Hibernate: Hibernate2.1.2
App:JBoss
测试阶段,没有采用connection pool


插入
java代码: 


      bo.setContentClob(Hibernate.createClob(" "));
      session.save(bo);
      session.flush();
      session.refresh(bo, LockMode.UPGRADE); //grabs an Oracle CLOB
      oracle.sql.CLOB clob = (oracle.sql.CLOB) bo.getContentClob();
      java.io.Writer pw = clob.getCharacterOutputStream();
      pw.write(content);
      pw.flush();
      pw.close();
      session.flush();



更新
java代码: 


      bo.setContentClob(Hibernate.createClob(" "));
      session.update(bo);
      session.flush();
      session.refresh(bo, LockMode.UPGRADE); //grabs an Oracle CLOB
      oracle.sql.CLOB clob = (oracle.sql.CLOB) bo.getContentClob();
      //注:如果是用weblogic connection pool,则用weblogic的OracleThinClob
      java.io.Writer pw = clob.getCharacterOutputStream();
      pw.write(content);
      pw.flush();
      pw.close();
      session.flush();



这种方式暂时搞定了问题,不过对于不太灵活,累赘啊。几乎不同的DAO就如需要重新写。

考虑如何更好的解决···思考中···


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值