`
windforce
  • 浏览: 80304 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

spring下lob数据处理

阅读更多

做了个简单的通告管理,在本机测试时数据量比较小。最开始用的时varchar2到2000,之后用hibernate中的text类型,对应数据库中的Clob类型。当数据量小于4000时,可以直接使用setObject()插入数据库。当数据量大于4000时。报错:socket write error。
查找了一些资料,说当数据量超过4000时,应该使用流方式操作。看到头昏昏,烦都烦死了......
最后发现Spring封装了对lob数据的操作,可以直接使用jdbcTemple操作lob数据。
当使用MySql、MSSQL、Oracle 10g时,使用DefaultLobHandler;使用Oracle 9i时使用OracleLobHandler。
示例代码:【转值javaWorld】

 1         final File binaryFile = new File("c:\\workspace\\wish.jpg" );
 2         final File txtFile = new File("c:\\workspace\\test.txt" );
 3         
 4         final InputStream is = new  FileInputStream(binaryFile);
 5         final Reader reader = new  FileReader(txtFile);
 6         
 7         JdbcTemplate jdbcTemplate = new  JdbcTemplate(dataSource);
 8         
 9         final LobHandler lobHandler = new  DefaultLobHandler();
10         
11         jdbcTemplate.execute("INSERT INTO test (txt, image) VALUES(?, ?)" ,
12                      new  AbstractLobCreatingPreparedStatementCallback(lobHandler) {
13                         protected void  setValues(PreparedStatement pstmt, LobCreator lobCreator)
14                                                            throws  SQLException, DataAccessException {
15                             lobCreator.setClobAsCharacterStream(pstmt, 1, reader, (int ) txtFile.length());
16                             lobCreator.setBlobAsBinaryStream(pstmt, 2, is, (int ) binaryFile.length());
17                          }
18                       });
19         
20          reader.close();
21          is.close();
22 

读取代码:

 1         final Writer writer = new FileWriter("c:\\workspace\\test_bak.txt" );
 2         final OutputStream os = new FileOutputStream(new File("c:\\workspace\\wish_bak.jpg" ));
 3         
 4         jdbcTemplate.query("SELECT txt,image FROM test WHERE id = ?" ,
 5                 new Object[] {new Integer(1 )},
 6                 new  AbstractLobStreamingResultSetExtractor() {
 7                     protected void streamData(ResultSet rs) throws  SQLException, IOException, DataAccessException {
 8                         FileCopyUtils.copy(lobHandler.getClobAsCharacterStream(rs, 1 ), writer);
 9                         FileCopyUtils.copy(lobHandler.getBlobAsBinaryStream(rs, 2 ), os);
10                      }
11                   });
12          writer.close();
13          os.close();
14 
15 
备注1:OracleLobHandler要求注入CommonsDbcpNativeJdbcExtractor,否则报错:要求使用OracleConnection,不可以使用Dbcp连接池。
1      < bean id = " lobHandler "   class = " org.springframework.jdbc.support.lob.OracleLobHandler " >
2      < property name = " nativeJdbcExtractor " >
3         < bean  class = " org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor " />
4     property >
5     bean >
备注2:Oracle驱动版本很多,要求使用正确的驱动。当驱动版本错误时,报错:无法释放LobHandler;无法关闭Writer;无法从套接字读取更多的信息。执行插入操作,但是Clob类型数据为空。

风之力 2006-11-08 16:20 发表评论
分享到:
评论
2 楼 _咖啡杯垫 2008-12-10  
代码如下:
public boolean executeSqlLob(final String sql, final Object[] objects,
			final int[] types) {
		if (objects.length != types.length) {
			return false;
		}
		try {
			transactionTemplate.execute(new TransactionCallbackWithoutResult() {
				@Override
				protected void doInTransactionWithoutResult(
						TransactionStatus status) {
					getJdbcTemplate().execute(sql,
							new AbstractLobCreatingPreparedStatementCallback(getLobHandler()) {
								protected void setValues(
										PreparedStatement pstmt,
										LobCreator lobCreator)
										throws SQLException,
										DataAccessException {
									for (int i = 0; i < objects.length; i++) {
										if (Types.CLOB == types[i]) {
											lobCreator.setClobAsCharacterStream(pstmt, i + 1, new CharArrayReader(objects[i].toString().toCharArray()), objects[i].toString().length());
										} 
										else if(Types.BLOB == types[i]){
											//do something...
										}
									}
								}

							});
				}
			});
			return true;
		} catch (DataAccessException exception) {
			exception.printStackTrace();
			return false;
		} 
	}


XML信息:
<!-- 适用于除Oracle10g外的其它版本Oracle数据库 -->
	<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">
		<property name="nativeJdbcExtractor">
			<bean class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>
		</property>
	</bean>


出现错误:
ava.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.invokeJdbcMethod(Ljava/lang/reflect/Method;Ljava/lang/Object;)Ljava/lang/Object;
	at org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor.getInnermostDelegate(CommonsDbcpNativeJdbcExtractor.java:81)
	at org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor.doGetNativeConnection(CommonsDbcpNativeJdbcExtractor.java:94)
	at org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractorAdapter.getNativeConnection(NativeJdbcExtractorAdapter.java:99)
	at org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractorAdapter.getNativeConnectionFromStatement(NativeJdbcExtractorAdapter.java:135)
	at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.getOracleConnection(OracleLobHandler.java:378)
	at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.createLob(OracleLobHandler.java:338)
	at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.setClobAsCharacterStream(OracleLobHandler.java:311)
	at com.model.support.impl.CommonServiceImpl$5$1.setValues(CommonServiceImpl.java:170)
	at org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback.doInPreparedStatement(AbstractLobCreatingPreparedStatementCallback.java:70)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:538)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:566)
	at com.model.support.impl.CommonServiceImpl$5.doInTransactionWithoutResult(CommonServiceImpl.java:161)
	at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:33)
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:127)
	at com.model.support.impl.CommonServiceImpl.executeSqlLob(CommonServiceImpl.java:157)
	at com.test.Test.main(Test.java:26)

1 楼 _咖啡杯垫 2008-12-10  
很巧,我也是使用的这种方法,但是还是有问题,搞得我不明白。

数据库:oracle9i
dbcp连接池

现:使用jdbcTemplate的execute(sql,PreparedStatementCallback)处理包含lob数据的insert,update,的工作,其中PreparedStatementCallback是AbstractLobCreatingPreparedStatementCallback的实现类,并通过org.springframework.jdbc.support.lob.OracleLobHandler(注入的nativeJdbcExtractor为org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor)来处理来自web层的大于4000字节以上的文本信息,并存入数据库。但是在测试时发现,有一个方法始终找不到:java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.invokeJdbcMethod(Ljava/lang/reflect/Method;Ljava/lang/Object;)Ljava/lang/Object;    我看过源代码,这个方法是存在的,我不知道为什么这里会有这样的错误。

我换过spring的jar包,还是一样的问题:找不到方法。

这个问题应该不是你说的DBCP连接池的原因吧, 你提到的:
    要求使用OracleConnection,不可以使用Dbcp连接池?

相关推荐

    简单易行:Spring中操作LOB字段案例

    在Spring框架中,LOB(Large Object)字段通常用于存储大数据,如BLOB(Binary Large Object)用于二进制数据,如图片或文档,CLOB(Character Large Object)...这些知识对于在Spring环境下处理大数据存储至关重要。

    Spring+Hibernate处理Oracle lob字段(一)

    最后,当从数据库中读取LOB数据时,可以将其转换为文件或字符串: ```java Blob blob = myEntity.getImage(); InputStream blobInputStream = blob.getBinaryStream(); // 使用blobInputStream写出到文件... Clob ...

    Spring+3.x企业应用开发实战光盘源码(全)

     第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生和获取等难点知识。  第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM...

    Spring.3.x企业应用开发实战(完整版).part2

    11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和行集 11.4.1 自增键的使用 11.4.2 如何规划主键方案 11.4.3 以行集返回数据 11.5 其他类型的JDBCTemplate 11.5.1 ...

    spring blob相关

    当涉及到数据库操作,特别是处理大型二进制对象(Binary Large Object,简称BLOB)时,Spring提供了灵活且强大的支持。Oracle数据库是企业级应用广泛采用的关系型数据库系统,它也支持BLOB类型来存储大量的二进制...

    Spring JdbcTemplate

    由于这个库主要是针对Oracle数据库设计的,所以很多特定的方法可能只适用于Oracle,比如处理lob类型数据、序列或者触发器相关的操作。在使用时,需要根据Oracle的特性和JdbcTemplate的API进行适当调整。

    spring oracle blob

    根据提供的标题、描述以及部分代码内容,我们可以整理出关于如何在Spring框架中处理Oracle数据库中的BLOB类型数据的相关知识点。 ### 一、BLOB类型简介 BLOB(Binary Large Object)是二进制大对象的缩写,通常...

    Spring3.x企业应用开发实战(完整版) part1

    11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和行集 11.4.1 自增键的使用 11.4.2 如何规划主键方案 11.4.3 以行集返回数据 11.5 其他类型的JDBCTemplate 11.5.1 ...

    spring1.2+hibernate2对大字段的处理实例

    在IT领域,尤其是在Java开发中,Spring和Hibernate是两个非常重要的框架。...这个"spring1.2+hibernate2对大字段的处理实例"就是一个很好的学习资源,能够帮助开发者深入理解如何在旧版框架下处理这类问题。

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生和获取等难点知识。  第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到...

    spring+struts+hibernate实现文件的上传和下载

    在 Spring 中,`OracleLobHandler` 负责处理 Blob 类型的字段,确保与数据库驱动程序解耦,并适应不同数据库的 Lob 处理方式。数据表的 Blob 字段在 Java 对象中声明为 `byte[]` 类型,而在 Hibernate 映射文件中...

    spring_mvc注解总结

    11. **@Lob**: 用于标记字段为Blob或Clob类型,用于存储大对象数据。 12. **@Basic(fetch = FetchType.LAZY)**: 结合@Lob使用,用于延迟加载大数据字段,提高性能。 13. **@Repository**: 标记数据访问组件,通常...

    Spring+hibernate4+SpringMVC+Jbpm4.4

    SpringMVC 是 Spring 框架的一个模块,专门用于处理Web应用的请求-响应模型,提供了一个轻量级的MVC架构。 **Hibernate ORM** Hibernate 是一个Java持久层框架,它简化了与关系数据库之间的交互。在Spring框架中,...

    Spring-Data-JPA快速使用

    通过Spring Data JPA,开发者可以更加专注于业务逻辑的实现而非底层的数据访问细节。 #### 二、Spring Data JPA 核心概念与使用流程 ##### 2.1 核心概念 - **Repository**: Spring Data JPA 的核心接口,通过继承...

    spring mvc+hibernate 图片存储至blob

    总结起来,"spring mvc+hibernate 图片存储至blob"这个主题涉及到Spring MVC处理文件上传、Hibernate将图片数据存入数据库BLOB字段、以及前后端交互等多个技术点。通过理解这些知识点,开发者可以构建一个完整的图片...

    ssh(structs,spring,hibernate)框架中的上传下载

     文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...

    spring+hibernate操作oracle的clob字段

    在Spring配置文件中,你需要创建一个`SessionFactory` bean,同时指定一个`lobHandler`属性,用于处理CLOB和BLOB类型的数据。这确保了Spring和Hibernate能够正确地与Oracle数据库交互处理大对象。 ```xml ...

    spring+hibernate 解决大字段(clob)

    本文将详细介绍如何在Spring与Hibernate框架结合的情况下,有效地处理Oracle 10g数据库中的CLOB字段。 #### 一、环境配置 为了确保项目能够顺利运行,首先需要搭建好开发环境。本示例中使用的环境配置如下: 1. *...

    springmvcdemo

    下载之后您只需要1.根据实体类创建数据库 2.jdbc.property填写正确 3.项目加载 运行 这里你将学习到: ...10 利用spring提供的lobHandler处理数据库中的lob列 11 利用log4j输出程序日志 12 无刷新翻页

Global site tag (gtag.js) - Google Analytics