tomcat连接池中解决clob字段的问题

1. 关于CLOB(Character Large Object)
CLOB可用于存放大文本数据,最多可存储4GB数据,在应用开发中比较常见.java提供的sql.Clob类与之对应.它提供两个方法来读取Clob的数据:
getCharacterStream() 方法返回按unicode编码的输入流(java.io.Reader对象)
getAsciiStream() 方法返回按ASCII编码的输入流(java.io.InputStream对象)
所以如果你的数据库中有可能存储中文字符的话,就要使用前一个方法.
现在举一个实际的例子,让我一步步学习如何使用CLOB.
首先,创建一个含CLOB字段的表:
create table test (id INTEGER, content clob);

接下来, 我们通过JSP往这张表里插入一条记录,然后再获取显示它.
插入操作:
<%  
Connection con 
=  DriverManager.getConnection(...);  // 该行从略 
String content  =  request.getParameter( " content " );  // 大文本数据 
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(); 
}
 
%>  


以上需要注意的几点是:
1)clob类型的数据不能直接insert,要先通过empty_clob()方法给它分配一个locator(同理,blob的用empty_blob()函数分配locator).然后把它select出来(此时它当然没有数据,但结果集不是空的),得到一个Clob的对象,修改该对象的内容让它满足我们的需要,再通过update方法更新该行记录.

2) 通过select修改含lob类型的记录时一定要锁定该行(通过for update关键字实现),否则oracle会报错.

3) 刚插入的记录就select for update, 会出现"违反读取顺序"错误,解决办法是将自动提交功能置为false,即不允许自动提交,然后commit它,再select,就可以了. 这就是上面那段代码里//*两行的作用.

4)补充点:如果用的 tomcat连接池,应该照上面插入数据时的写,否则样报错java.lang.ClassCastException ,在oracle9i以上好像没这个问题

下面,我们将刚插入的记录从数据库中读取出来并显示之:

<%  
String sql 
=   " select content from test where doc_id=1 "
ResultSet rs 
=  stmt.executeQuery(sql); 
String content 
=   ""
if  (rs.next()) 
oracle.sql.CLOB clob 
= (oracle.sql.CLOB)rs.getClob("content"); 
if (clob != null)
Reader is 
= clob.getCharacterStream(); 
BufferedReader br 
= new BufferedReader(is); 
String s 
= br.readLine(); 
while (s != null
content 
+= s + "<br>"
= br.readLine(); 
}
 
}
 
out.println(content); 
%> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值