论坛首页 Java企业应用论坛

Ibatis读写CLOB数据

浏览 24816 次
精华帖 (5) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-29  
不错,分析的很全面的文章
0 请登录后投票
   发表时间:2007-04-30  
今天居然搜索到这个:
http://javasky.bloghome.cn/posts/36215

有待测试

以下为原文
============================================================
由于工作需要, 要用到clob来存储, 并且使用的是ibatis做dao. 原来的配置是thin驱动, 结果试了n次, 始终得到如下的错误:
java.sql.SQLException: Io 异常: 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.rollback(TTC7Protocol.java:505)

    at oracle.jdbc.driver.OracleConnection.rollback(OracleConnection.java:1444)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

    at java.lang.reflect.Method.invoke(Unknown Source)

    at com.ibatis.common.jdbc.SimpleDataSource$SimplePooledConnection.invoke(SimpleDataSource.java:945)

    at $Proxy0.rollback(Unknown Source)



查了很多资料, 也在中加入了, 结果还是不好用, 错误依旧...偶然间在http://opensource.atlassian.com/confluence/oss/display/IBATIS/How+do+I+use+a+BLOB+or+CLOB 这里发现 "The example below was done for Oracle but should work for any database with a well written JDBC driver. Make sure that you do not use the thin driver supplied from Oracle. You need to use the latest ojbc14.jar."  不准用thin driver? 灵机一动, 马上换成oci driver, 惊奇的事情发生了, 插入成功了!!

呵呵, 原来是thin driver在作怪啊
0 请登录后投票
   发表时间:2007-05-08  
宏基小键盘 写道
请教楼上几个问题:
一、你的oracle驱动的版本。我用的是最新的ojdbc14-10.2.0.3.jar
二、clob字段可以设置大小?
三、我觉得写parameterMap非常不爽,因为是需要另外的配置,还有要一一对应,不如用inline parameterMap清爽一些。不知道有没有更好的解决方案


oracle驱动的版本,我记不清了,当时没有记录下来。应该10g的都可以吧
clob字段可以设置大小?这个是可以的
为什么不写parameterMap?虽然会麻烦一点,但是使用clob字段的表应该不会太多吧!!!
0 请登录后投票
   发表时间:2007-05-08  
宏基小键盘 写道
今天居然搜索到这个:
http://javasky.bloghome.cn/posts/36215

有待测试

以下为原文
============================================================
由于工作需要, 要用到clob来存储, 并且使用的是ibatis做dao. 原来的配置是thin驱动, 结果试了n次, 始终得到如下的错误:
java.sql.SQLException: Io 异常: 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.rollback(TTC7Protocol.java:505)

    at oracle.jdbc.driver.OracleConnection.rollback(OracleConnection.java:1444)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

    at java.lang.reflect.Method.invoke(Unknown Source)

    at com.ibatis.common.jdbc.SimpleDataSource$SimplePooledConnection.invoke(SimpleDataSource.java:945)

    at $Proxy0.rollback(Unknown Source)



查了很多资料, 也在中加入了, 结果还是不好用, 错误依旧...偶然间在http://opensource.atlassian.com/confluence/oss/display/IBATIS/How+do+I+use+a+BLOB+or+CLOB 这里发现 "The example below was done for Oracle but should work for any database with a well written JDBC driver. Make sure that you do not use the thin driver supplied from Oracle. You need to use the latest ojbc14.jar."  不准用thin driver? 灵机一动, 马上换成oci driver, 惊奇的事情发生了, 插入成功了!!

呵呵, 原来是thin driver在作怪啊


那还是驱动在作怪啊!!!呵呵
0 请登录后投票
   发表时间:2007-09-07  
为什么我成功插入了数据库
取出来时,为什么总是空的,取不出来呢
0 请登录后投票
   发表时间:2007-09-10  
我用你的方法试了一下,不知道为什么我启动服务器时,服务器会报错时说不支持[]byte. 当我不使用parametermap时,插入数据时会报错" 数据大小超出此类型的最大值: 105542"  .       另外我也尝试采用你一开始说的三种传统方法的最后一种时,他又会报"ORA-24813: 不能发送或接收不受支持的 LOB"   . 我真的好郁闷!! 吧 . 我用的是oracle10g,  驱动用的classes12.jar.
0 请登录后投票
   发表时间:2007-10-21  
复杂问题要简单化:
无需升级Oracle驱动,只要保证ibatis版本是2.0.x(具体版本记不清了)以上,用ibatis自己的解决方式,9i、10g均无问题,项目正在运行,8应该也无问题,源码看过,为发现不能适用于8的,但未测试。

SqlMapConfig:
    <typeHandler javaType="object" callback="com.ibatis.sqlmap.engine.type.BlobTypeHandlerCallback" jdbcType="BLOB"/>
    <typeHandler javaType="string" callback="com.ibatis.sqlmap.engine.type.ClobTypeHandlerCallback" jdbcType="CLOB"/>


resultMap:
        <result property="attachment" column="attachment" javaType="object" jdbcType="BLOB"/>


JavaBean字段:
    private byte[] attachment;


CLOB的示例不贴了,和对待普通VARCHAR2到String的映射一样,绝对无4000限制,因为后端实现是字符流处理。

若是超大数据量的BLOB存储(9i以上版本应使用BFILE字段类型),需包装默认类,将字段类型直接映射为java.sql.BLOB,基于流直接读取,和jdbc一样处理就ok(已实践)。
0 请登录后投票
   发表时间:2007-10-21  
用新的驱动就啥问题没有了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics