WebLogic JNDI 查询Clob值失败 (Mybatis+Spring+SpringMVC)
WebLogic JNDI 查询Clob值失败 (Mybatis+Spring+SpringMVC)
中国租女友网 发表于3年前
WebLogic JNDI 查询Clob值失败 (Mybatis+Spring+SpringMVC)
  • 发表于 3年前
  • 阅读 196
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

项目开始使用的数据源是:com.mchange.v2.c3p0.ComboPooledDataSource

后来部署到WebLogic服务器上、把数据源变成了:WebLogic的JNDI

出现问题类转换异常:weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 转换 oracle.sql.CLOB 失败

是因为Mybatis使用clob字段时、需要重写TypeHandler接口 实现clob转换


而weblogic有自带的CLOB字段、发生类转换异常


解决办法:下载weblogic包、保留jdbc类、引用到项目lib目录。(成功解决问题)


例子:http://hussion.iteye.com/blog/1530696

package utils;

import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


import oracle.sql.CLOB;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

public class OracleClobTypeHandler implements TypeHandler<Object> {


    @Override
    public Object getResult(ResultSet arg0, String arg1) throws SQLException {
        Clob clob = (Clob)arg0.getClob(arg1);
        
        return (clob == null || clob.length() == 0) ? null : clob.getSubString(
                (long) 1, (int) clob.length());
    }


    @Override
    public Object getResult(CallableStatement arg0, int arg1)
            throws SQLException {
        return null;
    }

    @Override
    public void setParameter(PreparedStatement arg0, int arg1, Object arg2,JdbcType arg3) throws SQLException {
        
        weblogic.jdbc.rmi.internal.Clob clob = (weblogic.jdbc.rmi.internal.Clob) CLOB.empty_lob();
        clob.setString(1, (String) arg2);
        
        arg0.setClob(arg1, clob);
    }
}


========================================================================================================
引用参考:http://www.blogjava.net/SpartaYew/archive/2011/05/18/350480.html

目前,笔者见到的有三种处理CLOB型ResultSet的方法:
1、Java原生ResultSet,通常的代码为:  oracle.sql.CLOB clob = ((OracleResultSet) rss).getCLOB(1);
2、Tomcat处理CLOB型ResultSet:须将lib下的classes12.jar(oracle包)删除,但程序不需要改动。
3、通过Weblogic的DataSource获得的连接池,可采用如下代码:
   weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob)rss.getClob(1);
   当然,要获得weblogic.jdbc.vendor.oracle.OracleThinClob接口还必须将D:\bea812\weblogic81\server\lib下的weblogic.jar
   拷贝到项目的E:\eclipse3.4.2\workspace\sykf\webapp\WEB-INF\lib下,才能正常使用。

鉴于本项目使用Weblogic做应用服务器,并且需要充分利用Weblogic的连接池建立的数据库连接,因此,笔者采用第三种方式来解决这个问题,也就是说将
D:\bea812\weblogic81\server\lib下的weblogic.jar拷贝到项目的E:\eclipse3.4.2\workspace\sykf\webapp\WEB-INF\lib下。

四、先为weblogic.jar减减肥吧

   要知道,从D:\bea812\weblogic81\server\lib下的weblogic.jar获得的该jar容量是非常大的,达36M之多, 这么大的jar包放到项目lib下有些笨拙,这个不要紧,可以对之进行减肥,将里面不需要的包删除掉就可以了,具体步骤如下:
  1)、解压该jar包,成为一个文件夹。
  2)、将里面除jdbc之外的包全部删除。
  3)、重新压缩成jar包。

  笔者通过上述处理之后,成功将36M体积的Weblogic.jar减肥为713K。

  在这里可能有读者会有如下疑问:
 
  你的lib下有weblogic.jar包,并且Weblogic下也有weblogic.jar包,并且两个jar中包含的jdbc.vendor.oracle.OracleThinclob相同,两者不会冲突吗?
  这个不必担心,因为包名类名虽然都相同,即使jvm也没法区分,那JVM在处理时就只有第一个包被引入(在classpath路径下排在前面的包),
  第二个包会在classloader加载类时判断重复而忽略。

共有 人打赏支持
粉丝 0
博文 7
码字总数 1223
×
中国租女友网
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: