使用JDBC处理Oracle大数据
一、Oracle中大数据处理
在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据 量非常大的业务领域(如图象、档案等)。
LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。
二、搭建测试环境
2.1、建立两个测试用的数据库表
建表SQL语句为:
1 CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB) 2 3 CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)
2.2、搭建测试项目架构
2.3、编写db.properties配置文件
1 oracleDb_Driver=oracle.jdbc.driver.OracleDriver 2 oracleDb_Url=jdbc:oracle:thin:@localhost:1521:GACL 3 oracleDb_UserName=GACL_XDP 4 oracleDb_Password=P
2.4、编写JdbcUtils工具类
1 package me.gacl.utils;2 3 import java.io.InputStream;4 import java.sql.Connection;5 import java.sql.DriverManager;6 import java.sql.ResultSet;7 import java.sql.SQLException;8 import java.sql.Statement;9 import java.util.Properties; 10 11 public class JdbcUtils { 12 13 private static String oracleDb_Driver = null; 14 private static String oracleDb_Url = null; 15 private static String oracleDb_UserName = null; 16 private static String oracleDb_Password = null; 17 18 static{ 19 try{ 20 //读取db.properties文件中的数据库连接信息 21 InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"); 22 Properties prop = new Properties(); 23 prop.load(in); 24 25 //获取数据库连接驱动 26 oracleDb_Driver = prop.getProperty("oracleDb_Driver"); 27 //获取数据库连接URL地址 28 oracleDb_Url = prop.getProperty("oracleDb_Url"); 29 //获取数据库连接用户名 30 oracleDb_UserName = prop.getProperty("oracleDb_UserName"); 31 //获取数据库连接密码 32 oracleDb_Password = prop.getProperty("oracleDb_Password"); 33 34 //加载数据库驱动 35 Class.forName(oracleDb_Driver); 36 37 }catch (Exception e) { 38 throw new ExceptionInInitializerError(e); 39 } 40 } 41 42 /** 43 * @Method: getOracleConnection 44 * @Description: 获取Oracle数据库连接对象 45 * @Anthor:孤傲苍狼 46 * 47 * @return Connection数据库连接对象 48 * @throws SQLException 49 */ 50 public static Connection getOracleConnection() throws SQLException{ 51 return DriverManager.getConnection(oracleDb_Url, oracleDb_UserName,oracleDb_Password); 52 } 53 54 /** 55 * @Method: release 56 * @Description: 释放资源, 57 * 要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象 58 * @Anthor:孤傲苍狼 59 * 60 * @param conn 61 * @param st 62 * @param rs 63 */ 64 public static void release(Connection conn,Statement st,ResultSet rs){ 65 if(rs!=null){ 66 try{ 67 //关闭存储查询结果的ResultSet对象 68 rs.close(); 69 }catch (Exception e) { 70 e.printStackTrace(); 71 } 72 rs = null; 73 } 74 if(st!=null){ 75 try{ 76 //关闭负责执行SQL命令的Statement对象 77 st.close(); 78 }catch (Exception e) { 79 e.printStackTrace(); 80 } 81 } 82 83 if(conn!=null){ 84 try{ 85 //关闭Connection数据库连接对象 86 conn.close(); 87 }catch (Exception e) { 88 e.printStackTrace(); 89 } 90 } 91 } 92 }
三、JDBC处理Oracle大数据
3.1、JDBC处理CLOB数据
1 package me.gacl.demo;2 3 import java.io.BufferedReader;4 import java.io.BufferedWriter;5 import java.io.FileReader;6 import java.io.FileWriter;7 import java.sql.Connection;8 import java.sql.PreparedStatement;9 import java.sql.ResultSet;10 import org.junit.Test;11 import me.gacl.utils.JdbcUtils;12 13 /**14 * @ClassName: JdbcOperaOracleClob15 * @Description:Oracle中字符型大型对象(Character Large Object)数据处理16 * @author: 孤傲苍狼17 * @date: 2014-10-7 下午3:53:1918 *19 */ 20 public class JdbcOperaOracleClob {21 22 /**23 CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)24 */25 /**26 * @Method: clobInsert27 * @Description:往数据库中插入一个新的CLOB对象28 * @Anthor:孤傲苍狼29 *30 * @throws Exception31 */ 32 @Test33 public void clobInsert() throws Exception {34 Connection conn = null;35 PreparedStatement stmt = null;36 ResultSet rs = null;37 conn = JdbcUtils.getOracleConnection();38 boolean defaultCommit = conn.getAutoCommit();39 /*开启事务,设定不自动提交 */40 conn.setAutoCommit(false);41 try {42 /* 插入一个空的CLOB对象 */43 String sql = "INSERT INTO TEST_CLOB VALUES (?, EMPTY_CLOB())";44 stmt = conn.prepareStatement(sql);45 stmt.setInt(1, 1);46 stmt.executeUpdate();47 /* 查询此CLOB对象并锁定 */48 sql = "SELECT CLOBCOL FROM TEST_CLOB WHERE ID=? FOR UPDATE";49 stmt = conn.prepareStatement(sql);50 stmt.setInt(1, 1);51 rs = stmt.executeQuery();52 if (rs.next()) {53 /* 取出此CLOB对象 */54 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");55 /* 向CLOB对象中写入数据 */56 BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());57 //这种方式获取的路径,其中的空格会被使用“%20”代替58 String path = JdbcOperaClob.class.getClassLoader().getResource("data.txt").getPath();59 //将“%20”替换回空格60 path = path.replaceAll("%20", " ");61 BufferedReader in = new BufferedReader(new FileReader(path));62 int c;63 while ((c = in.read()) != -1) {64 out.write(c);65 }66 in.close();67 out.close();68 }69 /* 正式提交 */70 conn.commit();71 System.out.println("插入成功");72 } catch (Exception ex) {73 /* 出错回滚 */74 conn.rollback();75 throw ex;76 }finally{77 /* 恢复原提交状态 */78 conn.setAutoCommit(defaultCommit);79 JdbcUtils.release(conn,stmt,rs);80 }81 82 }83 84 /**85 * @Method: clobRead86 * @Description: CLOB对象读取87 * @Anthor:孤傲苍狼88 *89 * @throws Exception90 */91 @Test92 public void clobRead() throws Exception {93 Connection conn = null;94 PreparedStatement stmt = null;95 ResultSet rs = null;96 conn = JdbcUtils.getOracleConnection();97 boolean defaultCommit = conn.getAutoCommit();98 conn.setAutoCommit(false);99 try { 100 /* 查询CLOB对象 */ 101 String sql = "SELECT * FROM TEST_CLOB WHERE ID=?"; 102 stmt = conn.prepareStatement(sql); 103 stmt.setInt(1, 1); 104 rs = stmt.executeQuery(); 105 if (rs.next()) { 106 /* 获取CLOB对象 */ 107 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL"); 108 /* 以字符形式输出 */ 109 BufferedReader in = new BufferedReader(clob.getCharacterStream()); 110 BufferedWriter out = new BufferedWriter(new FileWriter("D:\\2.txt")); 111 int c; 112 while ((c = in.read()) != -1) { 113 out.write(c); 114 } 115 out.close(); 116 in.close(); 117 } 118 } catch (Exception ex) { 119 conn.rollback(); 120 throw ex; 121 }finally{ 122 /* 恢复原提交状态 */ 123 conn.setAutoCommit(defaultCommit); 124 JdbcUtils.release(conn,stmt,rs); 125 } 126 } 127 128 /** 129 * @Method: clobModify 130 * @Description:修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改) 131 * @Anthor:孤傲苍狼 132 * 133 * @throws Exception 134 */ 135 @Test 136 public void clobModify() throws Exception { 137 Connection conn = null; 138 PreparedStatement stmt = null; 139 ResultSet rs = null; 140 conn = JdbcUtils.getOracleConnection(); 141 boolean defaultCommit = conn.getAutoCommit(); 142 // 开启事务 143 conn.setAutoCommit(false); 144 try { 145 /* 查询CLOB对象并锁定 */ 146 String sql = "SELECT CLOBCOL FROM TEST_CLOB WHERE ID=? FOR UPDATE"; 147 stmt = conn.prepareStatement(sql); 148 stmt.setInt(1, 1); 149 rs = stmt.executeQuery(); 150 if (rs.next()) { 151 /* 获取此CLOB对象 */ 152 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL"); 153 /* 进行覆盖式修改 */ 154 BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream()); 155 // 这种方式获取的路径,其中的空格会被使用“%20”代替 156 String path = JdbcOperaClob.class.getClassLoader().getResource("data2.txt").getPath(); 157 // 将“%20”替换回空格 158 path = path.replaceAll("%20", " "); 159 BufferedReader in = new BufferedReader(new FileReader(path)); 160 int c; 161 while ((c = in.read()) != -1) { 162 out.write(c); 163 } 164 in.close(); 165 out.close(); 166 } 167 /*提交事务 */ 168 conn.commit(); 169 } catch (Exception ex) { 170 /*出错回滚事务 */ 171 conn.rollback(); 172 throw ex; 173 }finally{ 174 /*恢复原提交状态 */ 175 conn.setAutoCommit(defaultCommit); 176 JdbcUtils.release(conn,stmt,rs); 177 } 178 } 179 180 /** 181 * @Method: clobReplace 182 * @Description:替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象) 183 * @Anthor:孤傲苍狼 184 * 185 * @throws Exception 186 */ 187 @Test 188 public void clobReplace() throws Exception { 189 Connection conn = null; 190 PreparedStatement stmt = null; 191 ResultSet rs = null; 192 conn = JdbcUtils.getOracleConnection(); 193 boolean defaultCommit = conn.getAutoCommit(); 194 // 开启事务 195 conn.setAutoCommit(false); 196 try { 197 /* 清空原CLOB对象 */ 198 String sql = "UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID=?"; 199 stmt = conn.prepareStatement(sql); 200 stmt.setInt(1, 1); 201 stmt.executeUpdate(); 202 203 /* 查询CLOB对象并锁定 */ 204 sql = "SELECT CLOBCOL FROM TEST_CLOB WHERE ID=? FOR UPDATE"; 205 stmt = conn.prepareStatement(sql); 206 stmt.setInt(1, 1); 207 rs = stmt.executeQuery(); 208 if (rs.next()) { 209 /* 获取此CLOB对象 */ 210 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL"); 211 /* 更新数据 */ 212 BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream()); 213 // 这种方式获取的路径,其中的空格会被使用“%20”代替 214 String path = JdbcOperaClob.class.getClassLoader().getResource("db.properties").getPath(); 215 // 将“%20”替换回空格 216 path = path.replaceAll("%20", " "); 217 BufferedReader in = new BufferedReader(new FileReader(path)); 218 int c; 219 while ((c = in.read()) != -1) { 220 out.write(c); 221 } 222 in.close(); 223 out.close(); 224 } 225 /* 正式提交 */ 226 conn.commit(); 227 } catch (Exception ex) { 228 /* 出错回滚 */ 229 conn.rollback(); 230 throw ex; 231 } finally { 232 /* 恢复原提交状态 */ 233 conn.setAutoCommit(defaultCommit); 234 JdbcUtils.release(conn, stmt, rs); 235 } 236 } 237 }
3.2、JDBC处理BLOB数据
Oracle定义了一个BLOB字段用于保存二进制数据,但这个字段并不能存放真正的二进制数据,只能向这个字段存一个指针,然后把数据放到指针所指向的Oracle的LOB段中, LOB段是在数据库内部表的一部分。因而在操作Oracle的Blob之前,必须获得指针(定位器)才能进行Blob数据的读取和写入。
如何获得表中的Blob指针呢? 可以先使用insert语句向表中插入一个空的blob(调用oracle的函数empty_blob()),这将创建一个blob的指针,然后再把这个empty的blob的指针查询出来,这样就可得到BLOB对象,从而读写blob数据了。
1、插入空blob:insert into testblob(id,image) values(?,empty_blob())
2、获得blob的cursor:
select image from testblob where id=? for update 注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突。
Blob b = rs.getBlob("image");
3、利用 io和获取到的cursor往数据库读写数据
注意:以上操作需开启事务。
BLOB对象的存取范例
1 package me.gacl.demo;2 3 import java.io.BufferedInputStream;4 import java.io.BufferedOutputStream;5 import java.io.FileOutputStream;6 import java.sql.Connection;7 import java.sql.PreparedStatement;8 import java.sql.ResultSet;9 import org.junit.Test;10 import me.gacl.utils.JdbcUtils;11 12 /**13 * @ClassName: JdbcOperaOracleBlob14 * @Description:Oracle中大数据处理15 * @author: 孤傲苍狼16 * @date: 2014-10-7 下午3:53:1917 *18 */ 19 public class JdbcOperaOracleBlob {20 21 /**22 * @Method: blobInsert23 * @Description: 向数据库中插入一个新的BLOB对象24 * @Anthor:孤傲苍狼25 * 26 * @throws Exception27 */28 @Test29 public void blobInsert() throws Exception {30 Connection conn = null;31 PreparedStatement stmt = null;32 ResultSet rs = null;33 boolean defaultCommit = true;34 try {35 conn = JdbcUtils.getOracleConnection();36 //得到数据库事务处理的默认提交方式37 defaultCommit = conn.getAutoCommit();38 //1、开启事务39 conn.setAutoCommit(false);40 //2、插入一个空的BLOB对象41 String sql = "INSERT INTO TEST_BLOB VALUES (?, EMPTY_BLOB())";42 stmt = conn.prepareStatement(sql);43 stmt.setInt(1, 1);44 stmt.executeUpdate();45 //3、查询此BLOB对象并锁定。注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突46 sql = "SELECT BLOBCOL FROM TEST_BLOB WHERE ID=? FOR UPDATE";47 stmt = conn.prepareStatement(sql);48 stmt.setInt(1, 1);49 rs = stmt.executeQuery();50 if (rs.next()) {51 //4、取出此BLOB对象 ,并强制转换成Oracle的BLOB对象52 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBCOL");53 //5、使用IO向BLOB对象中写入数据54 BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());55 BufferedInputStream in = new BufferedInputStream(JdbcOperaOracleBlob.class.getClassLoader().getResourceAsStream("01.jpg"));56 int c;57 while ((c = in.read()) != -1) {58 out.write(c);59 }60 in.close();61 out.close();62 }63 //6、提交事务64 conn.commit();65 } catch (Exception ex) {66 //7、出错回滚事务67 conn.rollback();68 throw ex;69 } finally {70 //8、恢复数据库事务处理的默认提交方式71 conn.setAutoCommit(defaultCommit);72 //释放资源73 JdbcUtils.release(conn, stmt, rs);74 }75 76 }77 78 /**79 * @Method: blobModify80 * @Description:修改BLOB对象(是在原BLOB对象基础上进行覆盖式的修改)81 * @Anthor:孤傲苍狼82 * 83 * @throws Exception84 */85 @Test86 public void blobModify() throws Exception {87 Connection conn = null;88 PreparedStatement stmt = null;89 ResultSet rs = null;90 boolean defaultCommit = true;91 try {92 conn = JdbcUtils.getOracleConnection();93 //得到数据库事务处理的默认提交方式94 defaultCommit = conn.getAutoCommit();95 //1、开启事务96 conn.setAutoCommit(false);97 //2、查询此BLOB对象并锁定。注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突98 String sql = "SELECT BLOBCOL FROM TEST_BLOB WHERE ID=? FOR UPDATE";99 stmt = conn.prepareStatement(sql); 100 stmt.setInt(1, 1); 101 rs = stmt.executeQuery(); 102 if (rs.next()) { 103 //3、取出此BLOB对象 ,并强制转换成Oracle的BLOB对象 104 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBCOL"); 105 //4、使用IO向BLOB对象中写入数据 106 BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); 107 BufferedInputStream in = new BufferedInputStream(JdbcOperaOracleBlob.class.getClassLoader().getResourceAsStream("02.jpg")); 108 int c; 109 while ((c = in.read()) != -1) { 110 out.write(c); 111 } 112 in.close(); 113 out.close(); 114 } 115 //5、提交事务 116 conn.commit(); 117 } catch (Exception ex) { 118 //6、出错回滚事务 119 conn.rollback(); 120 throw ex; 121 } finally { 122 //8、恢复数据库事务处理的默认提交方式 123 conn.setAutoCommit(defaultCommit); 124 //释放资源 125 JdbcUtils.release(conn, stmt, rs); 126 } 127 } 128 129 /** 130 * @Method: blobReplace 131 * @Description:替换BLOB对象(将原BLOB对象清除,换成一个全新的BLOB对象) 132 * @Anthor:孤傲苍狼 133 * 134 * @throws Exception 135 */ 136 @Test 137 public void blobReplace() throws Exception { 138 Connection conn = null; 139 PreparedStatement stmt = null; 140 ResultSet rs = null; 141 boolean defaultCommit = true; 142 try { 143 conn = JdbcUtils.getOracleConnection(); 144 //得到数据库事务处理的默认提交方式 145 defaultCommit = conn.getAutoCommit(); 146 //1、开启事务 147 conn.setAutoCommit(false); 148 //2、清空原BLOB对象 149 String sql = "UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID=?"; 150 stmt = conn.prepareStatement(sql); 151 stmt.setInt(1, 1); 152 stmt.executeUpdate(); 153 //3、查询此BLOB对象并锁定。注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突 154 sql = "SELECT BLOBCOL FROM TEST_BLOB WHERE ID=? FOR UPDATE"; 155 stmt = conn.prepareStatement(sql); 156 stmt.setInt(1, 1); 157 rs = stmt.executeQuery(); 158 if (rs.next()) { 159 //4、取出此BLOB对象 ,并强制转换成Oracle的BLOB对象 160 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBCOL"); 161 //5、使用IO向BLOB对象中写入数据 162 BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); 163 BufferedInputStream in = new BufferedInputStream(JdbcOperaOracleBlob.class.getClassLoader().getResourceAsStream("01.jpg")); 164 int c; 165 while ((c = in.read()) != -1) { 166 out.write(c); 167 } 168 in.close(); 169 out.close(); 170 } 171 //6、提交事务 172 conn.commit(); 173 } catch (Exception ex) { 174 //7、出错回滚事务 175 conn.rollback(); 176 throw ex; 177 } finally { 178 //8、恢复数据库事务处理的默认提交方式 179 conn.setAutoCommit(defaultCommit); 180 //释放资源 181 JdbcUtils.release(conn, stmt, rs); 182 } 183 } 184 185 /** 186 * @Method: blobRead 187 * @Description:BLOB对象读取 188 * @Anthor:孤傲苍狼 189 * 190 * @throws Exception 191 */ 192 @Test 193 public void blobRead() throws Exception { 194 Connection conn = null; 195 PreparedStatement stmt = null; 196 ResultSet rs = null; 197 boolean defaultCommit = true; 198 try { 199 conn = JdbcUtils.getOracleConnection(); 200 //得到数据库事务处理的默认提交方式 201 defaultCommit = conn.getAutoCommit(); 202 //1、开启事务 203 conn.setAutoCommit(false); 204 //2、查询BLOB对象 205 String sql = "SELECT BLOBCOL FROM TEST_BLOB WHERE ID=?"; 206 stmt = conn.prepareStatement(sql); 207 stmt.setInt(1, 1); 208 rs = stmt.executeQuery(); 209 if (rs.next()) { 210 //3、取出此BLOB对象 ,并强制转换成Oracle的BLOB对象 211 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBCOL"); 212 //4、以二进制流的形式输出 213 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("D:/1.jpg")); 214 BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream()); 215 int c; 216 while ((c = in.read()) != -1) { 217 out.write(c); 218 } 219 in.close(); 220 out.close(); 221 } 222 //5、提交事务 223 conn.commit(); 224 } catch (Exception ex) { 225 //6、出错回滚事务 226 conn.rollback(); 227 throw ex; 228 } finally { 229 //8、恢复数据库事务处理的默认提交方式 230 conn.setAutoCommit(defaultCommit); 231 //释放资源 232 JdbcUtils.release(conn, stmt, rs); 233 } 234 235 } 236 }
四、使用JDBC处理Oracle大数据总结
通过JDBC操纵Oracle数据库的LOB字段,不外乎插入、修改、替换、读取四种方式,掌握起来并不难。观察上述程序对LOB类型字段的存取,我们可以看出,较之其它类型字段,有下面几个显著不同的特点:
1、必须取消自动提交。
存取操作开始前,必须用setAutoCommit(false)取消自动提交。其它类型字段则无此特殊要求。这是因为存取LOB类型字段时,通常要进行多次操作可以完成。不这样的话,Oracle将抛出“读取违反顺序”的错误。
2、插入方式不同。
LOB数据不能象其它类型数据一样直接插入(INSERT)。插入前必须先插入一个空的LOB对象,CLOB类型 的空对象为EMPTY_CLOB(),BLOB类型的空对象为EMPTY_BLOB()。之后通过SELECT命令查询得到先前插入的记录并锁定,继而将 空对象修改为所要插入的LOB对象。
3、修改方式不同。
其它类型的字段修改时,用UPDATE … SET…命令即可。而LOB类型字段,则只能用SELECT … FOR UPDATE命令将记录查询出来并锁定,然后才能修改。且修改也有两种改法:一是在原数据基础上的修改(即覆盖式修改),执行SELECT … FOR UPDATE后再改数据;二是替换(先将原数据清掉,再修改),先执行UPDATE命令将LOB字段之值设为空的LOB对象,然后进行第一种改法。建议使 用替换的方法,以实现与其它字段UPDATE操作后一样的效果。
4、存取时应使用由数据库JDBC驱动程序提供的LOB操作类。
对于Oracle数据库,应使用oracle.sql.CLOB和oracle.sql.BLOB。不使用由数据库JDBC驱动程序提供的LOB类时,程序运行时易于出现“抽象方法调用”的错误,这是因为JDBC所定义的java.sql.Clob与 java.sql.Blob接口,其中的一些方法并未在数据库厂家提供的驱动程序中真正实现。
5、存取手段与文件操作相仿。
对于BLOB类型,应用InputStream/OutputStream类,此类不进行编码转换,逐个字节存取。oracle.sql.BLOB类相应提供了getBinaryStream()和getBinaryOutputStream()两个方法,前一个 方法用于读取Oracle的BLOB字段,后一个方法用于将数据写入Oracle的BLOB字段。
对于CLOB类型,应用Reader/Writer类,此类进行编码转换。oracle.sql.CLOB类相应 提供了getCharacterStream()和getCharacterOutputStream()两个方法,前一个方法用于读取Oracle的 CLOB字段,后一个方法用于将数据写入Oracle的CLOB字段。
需要说明的是,为了大幅提高程序执行效率,对BLOB/CLOB字段的读写操作,应该使用缓冲操作类(带 Buffered前缀),即:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。 例程中全部使用了缓冲操作类。
参见:http://www.cnblogs.com/xdp-gacl/p/4009399.html
转载于:https://www.cnblogs.com/GtShare/p/7597666.html
使用JDBC处理Oracle大数据相关推荐
- JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- Oracle 大数据集成实施
Oracle 大数据实施架构 Oracle为广大客户提供了一个预装的用于测试和学习目的的免费大数据环境.你可以在这个环境中对Oracle大数据一体机(Big Data Appliance)上的可选软件 ...
- 使用JDBC处理MySQL大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- MySQL 和 Oracle 大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
- oracle大数据量插入慢咋整
oracle大数据量插入慢咋整 alter index ind_t_object_id unusable; 下面是测试的过程: SQL> insert into milktest select ...
- Oracle 大数据量查询优化
前言:平常写的SQL可能主要以实现查询出结果为主,但如果数据量一大,就会突出SQL查询语句优化的性能独特之处.一般的数据库设计都会建索引查询,这样较全盘扫描查询的确快了不少.下面总结下SQL查询语句的 ...
- oracle 大数据量分页查询
(一)分页实现及性能 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SEL ...
- oracle大数据量删除方案
oracle进行大数据量删除的时候,容易报错表temp表空间空间不够导致删除失败,此时的处理方案有: 方案一: 分批删除,提交之后继续执行 方案二: 当剩下的数据量小于待删除的数据量时,可以使用转表的 ...
最新文章
- MySQL基于SSL协议的主从复制
- 博客园今天将排名计算错误了
- 分享我第一次做项目的感受
- 【C++】Visual Studio教程(三) - 项目和解决方案
- 分盘存储:实现数据库备集群备份文件分散存储
- Farthest sampling on 3d mesh with mesh kept
- -webkit-line-clamp超过两行就出现省略号
- Yii1.0框架整合融云解析(一)
- 【BZOJ5338】[TJOI2018]异或(主席树)
- 7-9 一元多项式的乘法与加法运算 (20 分)
- 《JDBC与Java数据库编程》pdf 附下载链接
- idea中刷新项目快捷键_IntelliJ Idea 常用快捷键列表
- vmware 您无权输入许可证密钥,请请使用系统管理员账户重试
- C# string转Intptr Intptr转string
- 新系统软件著作权申请详细步骤
- python判断身份证号码是否合法_怎样使用 Python 判断身份证号码是否正确-阿里云开发者社区...
- 软件测试缺陷报告总结
- 集合——Collections
- C语言入门笔记代码(第二天)
- 计算机专业学习阶段计划书怎么写,计算机专业学习计划优秀范文2篇
热门文章
- oracle 改变受限模式,oracle之受限模式修改
- 一文读懂802.1x协议,随便秒杀面试官
- pg_restore使用
- 知方可补不足~UPDLOCK更新锁的使用
- HappyAA服务器部署笔记1(nginx+tomcat的安装与配置)
- 给原型扩展一下tirm方法
- 设置 ASP.NET 存储当前应用程序的临时文件(生成的源、编译了的程序集等)的目录的物理路径。...
- 各大搜索引擎提交地址
- python错误集合
- 查看计算机80端口,电脑win10 80端口被占用的检测和解决方法