在使用tomcat连接池的情况下,怎样添加CLOB或BLOB字段值

来源:互联网 发布:贵州省大数据培训中心 编辑:程序博客网 时间:2024/05/22 12:30


今天写了一个小模块,其中需要对一个CLOB字段进行读写,由于之前未用到
这类字段,所以没遇到什么问题,于是就按普通的varchar类型来操作,即按
普通的insert和select来取值,在小于4K的文本时,没有什么问题,当一超过
该数字就开始报错,于是到网上查找原因:发现需要先往CLOB字段里面插入一个
空的CLOB值,即empty_clob,然后再取出并赋予新的文本,再予以更新:
相关案例代码如下:

以下代码引自(tomcat连接池中解决clob字段的问题 ):
http://blog.csdn.net/guaxixi627/archive/2007/08/02/1722755.aspx
con.setAutoCommit(false); //*
String sql = "insert into test values(1, empty_clob())";
Statement stmt = con.createStatement();
stmt.executeUpdate(sql);

con.commit(); //*
sql = "select content from test where id=1 for update";
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) ...{
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1);
//如果用的是tomcat连接池此处使用  
//oracle.sql.CLOB clob = (CLOB) ((org.apache.commons.dbcp.DelegatingResultSet)rs).getClob("CONTENT");
clob.putString(1, content);
sql = "update test set content=? where id=" + seq;
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setClob(1, clob);
pstmt.executeUpdate();
end 引用结束

于是我就按照上面的来改,可我在oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1); 这一句始终都报
ClassCastException错误,我用的是Tomcat连接池,即使按照
oracle.sql.CLOB clob = (CLOB) ((org.apache.commons.dbcp.DelegatingResultSet)rs).getClob("CONTENT");
也一样 报错(org.apache.commons.dbcp.DelegatingResultSet需要引用commons.pool.jar和commons.dbcp.jar这两个包)
网上说一定要使用
import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.CLOB;
我的也确实是这样引用的,可依然报错,经过调试发现是java.sql.ResultSet无法转化为OracleResultSet,于是又去网上找:
终于发现原来是DBConnection的类型不对,如果要将java.sql.ResultSet转化为OracleResultSet,这个所依靠的Connection必须
要由OracleDataSource来返回的Connection才行,于是按照下面的这篇文章来做:

以下文章转自:http://topic.csdn.net/u/20070315/21/2ac06a1e-963a-419f-b38d-961fb1a6bfc8.html?75999205

需要用OracleDataSource代替DataSource,否则强制类型转换会出错。用法如下:
import oracle.jdbc.pool.*;
  OracleDataSource ds = new OracleDataSource();
  ds.setDriverType("thin");
  ds.setServerName("dssw2k01");
  ds.setPortNumber(1521);
  ds.setDatabaseName("orcl"); // sid
  ds.setUser("scott");
  ds.setPassword("tiger");

  Connection conn = ds.getConnection();

  Statement stmt = conn.createStatement();
  stmt.executeUpdate("INSERT INTO FUJIAN (NUM_ID,BFILE) VALUES("+numid+",EMPTY_BLOB())"); //增加空的BLOB
  ResultSet myResultSet=stmt.executeQuery("SELECT BFILE FROM FUJIAN WHERE NUM_ID="+numid+" FOR UPDATE");//锁定更新BLOB
  myResultSet.next();
  BLOB myBlob=((OracleResultSet)myResultSet).getBLOB("BFILE");//强制类型转换

无论是CLOB还是BLOB问题解决。

我的开发环境是Tomcat6.0+MyEclipse6.5+Oracel 10G

附两种Connection的获取方法:
//javax.sql.DataSource获取Oracel连接
private Connection getJavaConnection() {
 Context context = null;
 Connection conn = null;
 try {
  context = new javax.naming.InitialContext();

  DataSource dataSource=null;
  dataSource = (DataSource) context.lookup("java:comp/env/TestDataSource");
  
  conn = dataSource.getConnection();
 } catch (Exception e) {
  CLog.dumpMessage("javax.sql.DataSource 获取数据源ORA-1", e);
 }
 return conn;
}
//OracleDataSource获取Oracle连接
private Connection getOracleConnection() {
 Connection conn = null;
 try {
  OracleDataSource ds = new OracleDataSource();
  ds.setURL("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
  ds.setUser("Test");
  ds.setPassword("p123456");
  
  conn = ds.getConnection();
 } catch (Exception e) {
  CLog.dumpMessage("oracle.jdbc.pool.OracleDataSource 获取数据源ORA-2", e);
 }
 return conn;
}

原创粉丝点击