`

SI中的LOB问题

阅读更多

      继博文IBATIS存活空间续--SI(SpringIbatis)实现之后,本博文给出SI(SpringIbatis)实现中的LOB问题,尤其是CLOB,根据相关资料,简单地给出两种解决方案!

 

问题一:SI中的LOB问题
SI中的LOB配置在com/si/dao/core/lob.xml中,采用默认的处理器,可按需修改。lob.xml中内容如下:

<!-- 默认的DefaultLobHandler -->
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />
<!-- 特定的OracleLobHandler-->
<!-- 以c3p0数据库连接池为例,其它类型的数据库连接池仅需更换相应的jdbcExtractor类即可 -->
<!-- 
<bean id="jdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor" /> 
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">    
 <property name="nativeJdbcExtractor" ref="jdbcExtractor"/>
</bean>  
-->

 
问题二:关于LOB解决之道:(针对Oracle9i或更高版本)
注:主要是CLOB问题,CLOB资料http://developer.51cto.com/art/200907/136699.htm
方案一:采用spring的DefaultLobHandler
前提:Oracle 9i或更高版本,ojdgc14或更高版本驱动JAR
    (推荐10g以上驱动,如ojdbc5-11.1.0.6.0-Produc.jar或ojdbc14-10.2.0.4.0.jar)
优点:完全透明化,(遵循最佳实践parameterClass&resultMap)
不足:只是对Oracle的CLOB只能支持到最大值4000字符
备注:原则上说,DefaultLobHandler不支持Oracle9i,且对Oracle10g仅有限支持;关于此点限制应该是指对CLOB的支持,因为在Oracle9i中我应用的BLOB操作无任何问题,而CLOB当时没太在意,不知是否存在4k字符的限制,若有,请采用方案二。
在xSpring.xml中样例

<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />
<!-- 配置sqlMapClient -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="lobHandler" ref="lobHandler"/>
 <property name="configLocation" value="classpath:ibatis.xml" />   
</bean>

 
在ibatis.xml中的全局配置

<typeHandler jdbcType="BLOB" javaType="[B" callback="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/>
<typeHandler jdbcType="CLOB" javaType="java.lang.String" callback="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/>

 
 
方案二:采用spring的OracleLobHandler
前提
:Oracle 9i或更高版本,ojdgc14或更高版本驱动JAR
优点:完全透明化,解决CLOB最大值为4k字符的限制(遵循最佳实践parameterClass&resultMap)
不足:需要根据数据库连接的类型选择不同的本地SQL执行器,如Spring2.5.6中支持的:
 ①直接JDBC:SimpleNativeJdbcExtractor或Jdbc4NativeJdbcExtractor(若采用jdbc4 api)
 ②c3p0数据库连接池:CommonsDbcpNativeJdbcExtractor
 ③dhcp数据库连接池:C3P0NativeJdbcExtractor
 ④xprool数据库连接池:XAPoolNativeJdbcExtractor
 ⑤jboss数据库连接池:JBossNativeJdbcExtractor
 ⑥weblogic数据库连接池:WebLogicNativeJdbcExtractor
 ⑦websphere数据库连接池:WebSphereNativeJdbcExtractor
在xSpring.xml中样例

<bean id="jdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor" /> 
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">    
 <property name="nativeJdbcExtractor" ref="jdbcExtractor"/>
</bean>

 
<!-- 配置sqlMapClient -->

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="lobHandler" ref="lobHandler"/>
 <property name="configLocation" value="classpath:ibatis.xml" />   
</bean>

 
在ibatis.xml中的全局配置(同上)

 

以下是参考资料,来自于Spring2.5.6的源码

pakage org.springframework.orm.ibatis.support;
/**
 * iBATIS TypeHandler implementation for byte arrays that get mapped to BLOBs.
 * Retrieves the LobHandler to use from SqlMapClientFactoryBean at config time.
 *
 * <p>Can also be defined in generic iBATIS mappings, as DefaultLobCreator will
 * work with most JDBC-compliant database drivers. In this case, the field type
 * does not have to be BLOB: For databases like MySQL and MS SQL Server, any
 * large enough binary type will work.
 *
 * @author Juergen Hoeller
 * @since 1.1.5
 * @see org.springframework.orm.ibatis.SqlMapClientFactoryBean#setLobHandler
 */
public class BlobByteArrayTypeHandler extends AbstractLobTypeHandler {
 //...
}
/**
 * iBATIS TypeHandler implementation for arbitrary objects that get serialized to BLOBs.
 * Retrieves the LobHandler to use from SqlMapClientFactoryBean at config time.
 *
 * <p>Can also be defined in generic iBATIS mappings, as DefaultLobCreator will
 * work with most JDBC-compliant database drivers. In this case, the field type
 * does not have to be BLOB: For databases like MySQL and MS SQL Server, any
 * large enough binary type will work.
 *
 * @author Juergen Hoeller
 * @since 1.1.5
 * @see org.springframework.orm.ibatis.SqlMapClientFactoryBean#setLobHandler
 */
public class BlobSerializableTypeHandler extends AbstractLobTypeHandler {
 //...
}
/**
 * iBATIS TypeHandler implementation for Strings that get mapped to CLOBs.
 * Retrieves the LobHandler to use from SqlMapClientFactoryBean at config time.
 *
 * <p>Particularly useful for storing Strings with more than 4000 characters in an
 * Oracle database (only possible via CLOBs), in combination with OracleLobHandler.
 *
 * <p>Can also be defined in generic iBATIS mappings, as DefaultLobCreator will
 * work with most JDBC-compliant database drivers. In this case, the field type
 * does not have to be BLOB: For databases like MySQL and MS SQL Server, any
 * large enough binary type will work.
 *
 * @author Juergen Hoeller
 * @since 1.1.5
 * @see org.springframework.orm.ibatis.SqlMapClientFactoryBean#setLobHandler
 */
public class ClobStringTypeHandler extends AbstractLobTypeHandler {
 //...
}

package org.springframework.jdbc.support.lob;
/**
 * Default implementation of the {@link LobHandler} interface. Invokes
 * the direct accessor methods that <code>java.sql.ResultSet</code>
 * and <code>java.sql.PreparedStatement</code> offer.
 *
 * <p>This LobHandler should work for any JDBC driver that is JDBC compliant
 * in terms of the spec's suggestions regarding simple BLOB and CLOB handling.
 * This does not apply to Oracle 9i, and only to a limited degree to Oracle 10g!
 * As a consequence, use {@link OracleLobHandler} for accessing Oracle BLOBs/CLOBs.
 *
 * <p>Some JDBC drivers require values with a BLOB/CLOB target column to be
 * explicitly set through the JDBC <code>setBlob</code> / <code>setClob</code>
 * API: for example, PostgreSQL's driver. Switch the {@link #setWrapAsLob "wrapAsLob"}
 * property to "true" when operating against such a driver.
 *
 * <p>On JDBC 4.0, this LobHandler also supports streaming the BLOB/CLOB content
 * via the <code>setBlob</code> / <code>setClob</code> variants that take a stream
 * argument directly. Consider switching the {@link #setStreamAsLob "streamAsLob"}
 * property to "true" when operating against a fully compliant JDBC 4.0 driver.
 *
 * <p>See the {@link LobHandler} javadoc for a summary of recommendations.
 *
 * @author Juergen Hoeller
 * @since 04.12.2003
 * @see #setStreamAsLob
 * @see java.sql.ResultSet#getBytes
 * @see java.sql.ResultSet#getBinaryStream
 * @see java.sql.ResultSet#getString
 * @see java.sql.ResultSet#getAsciiStream
 * @see java.sql.ResultSet#getCharacterStream
 * @see java.sql.PreparedStatement#setBytes
 * @see java.sql.PreparedStatement#setBinaryStream
 * @see java.sql.PreparedStatement#setString
 * @see java.sql.PreparedStatement#setAsciiStream
 * @see java.sql.PreparedStatement#setCharacterStream
 */
public class DefaultLobHandler extends AbstractLobHandler {
 //...
}
/**
 * {@link LobHandler} implementation for Oracle databases. Uses proprietary API
 * to create <code>oracle.sql.BLOB</code> and <code>oracle.sql.CLOB</code>
 * instances, as necessary when working with Oracle's JDBC driver.
 * Note that this LobHandler requires Oracle JDBC driver 9i or higher!
 *
 * <p>While most databases are able to work with {@link DefaultLobHandler},
 * Oracle just accepts Blob/Clob instances created via its own proprietary
 * BLOB/CLOB API, and additionally doesn't accept large streams for
 * PreparedStatement's corresponding setter methods. Therefore, you need
 * to use a strategy like this LobHandler implementation.
 *
 * <p>Needs to work on a native JDBC Connection, to be able to cast it to
 * <code>oracle.jdbc.OracleConnection</code>. If you pass in Connections from a
 * connection pool (the usual case in a J2EE environment), you need to set an
 * appropriate {@link org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor}
 * to allow for automatical retrieval of the underlying native JDBC Connection.
 * LobHandler and NativeJdbcExtractor are separate concerns, therefore they
 * are represented by separate strategy interfaces.
 *
 * <p>Coded via reflection to avoid dependencies on Oracle classes.
 * Even reads in Oracle constants via reflection because of different Oracle
 * drivers (classes12, ojdbc14) having different constant values! As this
 * LobHandler initializes Oracle classes on instantiation, do not define this
 * as eager-initializing singleton if you do not want to depend on the Oracle
 * JAR being in the class path: use "lazy-init=true" to avoid this issue.
 *
 * @author Juergen Hoeller
 * @since 04.12.2003
 * @see #setNativeJdbcExtractor
 * @see oracle.sql.BLOB
 * @see oracle.sql.CLOB
 */
public class OracleLobHandler extends AbstractLobHandler {
 //...
}

 

0
0
分享到:
评论

相关推荐

    Oracle数据库中LOB的调优.pdf

    Oracle数据库中LOB的调优 Oracle数据库中的LOB(Large OBject)是一种特殊的数据类型,用于存储大量的二进制数据或字符数据。LOB数据类型包括BLOB、CLOB、NCLOB和BFILE四种,分别用于存储二进制数据、字符数据、...

    oracle dbms_lob

    Oracle数据库系统中,`DBMS_LOB`是一个重要的PL/SQL包,专门用于处理大型对象(LOBs,Large Object)。LOBs是Oracle提供的一种数据类型,用于存储大量数据,如文本、图像、音频或视频文件等。这个包包含了各种过程和...

    本文档主要介绍如何对LOB字段进行处理

    为了解决这一问题,Oracle数据库引入了LOB(Large Objects,大对象)数据类型来存储大量二进制和文本数据。本文旨在详细介绍如何在Oracle数据库中使用和维护LOB数据类型。 #### LOB概述 在Oracle数据库中,LOB是一...

    Oracle LOB 详解

    Oracle 11gR2 文档中提到,LOB 可以存储在表中,也可以作为对象类型的属性。同时,Oracle 10gR2 文档中也提供了关于 LOB 的详细信息。 1.1 创建包含 LOB 的表 创建包含 LOB 的表时,需要遵守以下几个原则: * ...

    ORACLE LOB大对象处理

    对LOB字段建立索引需要特别注意,因为它们的大小可能导致性能问题。可以选择使用位图索引或快速全扫描索引。 7. **LOB与备份恢复** 备份和恢复LOB数据需要特殊考虑,如使用RMAN(Recovery Manager)或Data Pump...

    Oracle Lob Performance Guidelines

    ASSM 可以有效地处理 LOB 对象的碎片问题,从而提高性能。 3. **索引组织表**:对于频繁查询的 LOB 字段,考虑使用索引组织表(IOT)。这样可以在查询时避免额外的表扫描,提高查询效率。 4. **并行操作**:利用...

    Oracle LOB字段处理工具

    6. **日志记录**:为了追踪操作历史和问题排查,工具可能会有日志记录功能,记录每次对LOB字段的操作。 7. **跨平台支持**:从文件名来看,"lobs_linux32_10204.bin"表明该工具至少有一个适用于32位Linux系统的版本...

    DB2 LOB 详解

    例如,LOB数据的创建涉及的注意事项,可能遇到的问题,以及应该考虑的因素。维护LOB数据时,DBA需要使用特定的工具进行备份和恢复操作。备份和恢复工作对于LOB数据来说尤为重要,因为这些操作对大型对象数据的完整性...

    前端开源库-lob

    在Web应用中集成LOB库,可以将数字化的服务扩展到实体世界,提升用户体验,比如自动发送账单、个性化贺卡或者定制化产品标签。 **1. Lob API包装** Lob库为前端开发者提供了一层友好的封装,使得调用LOB API变得...

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

    在Spring框架中,LOB(Large Object)字段通常用于存储大数据,如BLOB(Binary Large Object)用于二进制数据,如图片或文档,CLOB(Character Large Object)用于字符数据,如长文本。本篇文章将深入探讨如何在...

    英语语料库LOB语料库

    LOB语料库 创建时间: 1970年代初 创建单位:英国Lancaster大学和挪威Oslo大学以及Bergen大学 规模层级: 100万词次 基本情况:研究当代英国英语,与美国英语对比,使用了TAGIT系统,以统计方式建立换算几率矩阵,提高标注...

    SQL Server存储LOB数据的策略与方法.pdf

    在探讨SQL Server数据库中存储LOB(Large Object)数据的策略与方法时,首先需要理解几个核心概念和原理。LOB数据类型通常是指存储在数据库中非常大的二进制或者字符型数据,例如文档、图表和图像文件。这些数据的...

    Oracle中LOB字段的存储管理和优化.pdf

    Oracle 中 LOB 字段的存储管理和优化 Oracle 中 LOB(Large OBjects)字段是一种特殊的数据类型,用于存储非结构化数据,如图像、音频、视频等。LOB 字段的存储管理和优化是数据库管理中一个重要的方面。本文将...

    sybaseIQ LOB手册

    Sybase IQ LOB手册是一本专业指导手册,旨在为Sybase IQ数据库管理系统用户提供如何在IQ中管理大对象(LOB)的指导。LOB主要指图片、视频、音频等大型数据类型,这类数据因为其体积较大,不适合用常规的关系型字段...

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    ODI LOB 类型KM

    在给定的压缩包文件中,我们有两个与LOB(Large Object)类型相关的Knowledge Modules(KM),它们是KM_IKM Oracle Incremental UpdateLOB.xml和KM_LKM SQL to SQL LOB (JYTHON).xml。 首先,让我们详细了解一下LOB...

    Brown语料库和LOB语料库

    LOB语料库是模仿Brown语料库的比例建立起来的英国英语语料库,其预料搜集自1961年英国英语出版物上的文本,共500篇,每篇大约2000个单词,合计100万单词。Brown语料库带词性标记,LOB语料库不带词性标记。

    OCI_LOB样例程序

    在Oracle数据库中,LOB(Large Object)是用来存储大量数据的数据类型,如文本、图像或音频文件。OCI(Oracle Call Interface)是Oracle提供的C语言接口,用于开发与Oracle数据库交互的应用程序。`OCI_LOB`样例程序...

Global site tag (gtag.js) - Google Analytics