日期:2014-05-17  浏览次数:21151 次

Java中delete删除不了数据
初学者,大致描述一下功能。是做个缓存,代码家里木有...
  数据库中有一个字段是CLOB类型,查询CLOB和插入CLOB都已经解决。但是最开始好用的删除竟然崩溃了。
(1)查询数据(启用缓存)→查询缓存表(缓存表有信息)→读取缓存表
(2)查询数据(启用缓存)→查询缓存表(缓存表无信息)→正常查询→查询结果插入缓存表
(3)查询数据(不启用缓存)→查询缓存表(缓存表有信息)→删除缓存表中信息→正常查询→查询结果插入缓存表
(4)查询数据(不启用缓存)→查询缓存表(缓存表无信息)→正常查询→查询结果插入缓存表


  删除功能最初是好用的,因为插入CLOB字段数据量大于4000,通过这个方法解决了插入问题,但是删除功能崩溃,考虑了屏蔽了自动提交,添加提交也木有用。
  将大字段存入Oracle数据库CLOB字段代码大致如下。其中有select for update锁表和自动提交改成false.
  JAVA代码如下:

 
import java.sql.*;

import oracle.jdbc.OracleResultSet;
import oracle.sql.CLOB;

public class ClobTest {
public static void main(String[] args)throws Exception{
  Class.forName("oracle.jdbc.driver.OracleDriver");
  Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");
  conn.setAutoCommit(false);
  
  //下面往数据库里加入一行,其中value字段设置其值为empty_clob(),即设置为空值,以便接下来更改
  PreparedStatement stmt = conn.prepareStatement("INSERT INTO clob_test VALUES (1,empty_clob())");
  stmt.execute();
  
  //下面执行SELECT查询,以取得一个oracle.sql.CLOB对象
  //然后调用CLOB对象的putChar()方法写入数据。  
  stmt = conn.prepareStatement("SELECT value FROM clob_test FOR UPDATE");
  ResultSet rs = stmt.executeQuery();
  rs.next();
  CLOB clob = ((OracleResultSet)rs).getCLOB(1);
  clob.putChars(1,"this is a clob test!!!".toCharArray());
  
  //这里把上面得到的已经写入数据的clob对象上传到数据库
  stmt = conn.prepareStatement("UPDATE clob_test SET value=?");
  stmt.setClob(1,clob);
  stmt.execute();
  conn.commit();
  
  //检验结果。
  stmt = conn.prepareStatement("SELECT * FROM clob_test");
  rs = stmt.executeQuery();
  rs.next();
  Clob clob1 = rs.getClob("value");
  String s = clob.getSubString((long)1,(int)clob.length()-1);
  System.out.println(s);

//收尾工作
  rs.close();
  stmt.close();
  conn.close();
}
}


------解决方案--------------------
几个地方修改一下。
1.stmt.execute();
==>

 stmt.executeUpdate();

2.stmt = conn.prepareStatement前加stmt.close();