成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iBATIS操作CLOB字段實戰(zhàn)淺析

開發(fā) 后端
iBATIS操作CLOB字段實戰(zhàn)中是怎么實施的呢?我們將在這篇文章中看到實際的分析,iBATIS操作CLOB字段實戰(zhàn)淺析將給你答案。

iBATIS操作CLOB字段的問題:在網(wǎng)上搜索發(fā)現(xiàn)有人遇到了相似的問題,但是情況不盡相同。現(xiàn)在把經(jīng)驗寫出來,與大家分享。

環(huán)境:

JDK/JRE:1.5.0;Spring:1.2.7;iBATIS:2.1.7;Oracle:9.2.0.1;JDBC:OJDBC14_10g.jar

目標(biāo):

基于Spring提供的DBCP,使用iBATIS SQL Maps更新數(shù)據(jù)庫的CLOB字段。

現(xiàn)象:

總是有少部分特定的數(shù)據(jù)沒有更新,且并不是因為數(shù)據(jù)過長而失敗,有時很短的數(shù)據(jù)也會失敗。現(xiàn)象可以重現(xiàn)。原來的SQL的 Maps配置文件如下:

  1. ﹤update id="updateByFoodID" parameterClass="Food"﹥  
  2.   update TB_FOOD  
  3.     ﹤dynamic prepend="set"﹥  
  4.       ﹤isNotNull prepend="," property="foodDesc"﹥  
  5.         FOOD_DESC = #foodDesc#  
  6.       ﹤/isNotNull﹥  
  7.       ﹤isNotNull prepend="," property="foodImage"﹥  
  8.         FOOD_IMAGE = #foodImage#  
  9.       ﹤/isNotNull﹥  
  10.     ﹤/dynamic﹥  
  11.   where FOOD_ID = #foodID#  
  12. ﹤/update﹥ 

查看log4j的DEBUG輸出,只有Preparing Statement、Executing Statement、和Parameters,并沒有異常輸出。

iBATIS操作CLOB字段初步分析原因,有如下6個:

1、首先還是懷疑有地方數(shù)據(jù)過長;

2、操作的長字符串是JSON格式的,并且數(shù)據(jù)內(nèi)容可能包含‘?’、‘/’等特殊字符;

3、由于有多個程序同時使用該表,可能是事務(wù)隔離的原因;

4、LOB字段在Dynamic Mapped Statements中運行的問題;

5、這個版本的Spring對iBATIS的支持問題;

6、JDBC的版本問題。

iBATIS操作CLOB字段分別分析:

1、VARCHAR2類型的列最長為4000字節(jié),VARCHAR2類型的PL/SQL變量最長為32767字節(jié),操作的數(shù)據(jù)確實有可能超過64k,但程序中沒有使用VARCHAR2變量存儲數(shù)據(jù),LOB類型的列更是可以存儲4G的數(shù)據(jù);

2、走查更新失敗的字符串內(nèi)容,沒有發(fā)現(xiàn)特殊之處;

3、新建一張臨時表,用以進(jìn)行insert和update操作,發(fā)現(xiàn)并沒有解決問題;

4、去掉動態(tài)部分,寫最簡單的SQL語句,也沒有解決問題;

5、(暫時略過);

6、這個可能性比較小,一直都在用***版本的JDBC。

網(wǎng)上有人提到3種辦法,其中“第2種”,給SqlMapClientFactoryBean增加lobHandler屬性,據(jù)稱是指能工作在native的驅(qū)動方式下,經(jīng)查Spring的API文檔,并不準(zhǔn)確,摘錄文檔如下:

While most databases are able to work with 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.

Needs to work on a native JDBC Connection, to be able to cast it to oracle.jdbc.OracleConnection. If you pass in Connections from a connection pool (the usual case in a J2EE environment), you need to set an appropriate 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.

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.

因此,修改Spring配置文件:

  1. ﹤bean id="jdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" /﹥  
  2. ﹤bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true"﹥  
  3.     ﹤property name="nativeJdbcExtractor"﹥﹤ref local="jdbcExtractor" /﹥﹤/property﹥  
  4. ﹤/bean﹥  
  5. ﹤bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"﹥  
  6.     ﹤property name="configLocation" value="classpath:conf/sqlMapConfig.xml"﹥﹤/property﹥  
  7.     ﹤property name="dataSource"﹥﹤ref local="aeqdsDataSource" /﹥﹤/property﹥  
  8.     ﹤property name="lobHandler"﹥﹤ref local="oracleLobHandler" /﹥﹤/property﹥  
  9. ﹤/bean﹥ 

未果。

使用提到的“第3種”方法,這又有2種方式,第1種是全局性的,在SQL Maps配置文件中加入callback方法:

  1. ﹤typeHandler jdbcType="BLOB" javaType="[B" callback="org.  
  2. ringframework.orm.ibatis.support.BlobByteArrayTypeHandler" /﹥  
  3. ﹤typeHandler jdbcType="CLOB" javaType="java.lang.String"   
  4. llback="org.springframework.orm.ibatis.support.ClobStringTypeHandler" /﹥ 

第2種是在單個的屬性上指定typeHandler,如果是select,就可以用:

  1. ﹤resultMap id="foodResult" class="Food"﹥  
  2.   ﹤result property="foodId" column="FOOD_ID"/﹥  
  3.   ﹤result property="foodDesc" column="FOOD_DESC" typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/﹥  
  4.   ﹤result property="foodImage" column="FOOD_IMAGE" typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/﹥  
  5. ﹤/resultMap﹥ 

如果是insert或update,就可以用:

  1. ﹤update id="updateByFoodID" parameterClass="Food"﹥  
  2.   update TB_FOOD  
  3.     set FOOD_DESC = #foodDesc,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,  
  4.         FOOD_IMAGE = #foodImage,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#  
  5.     where FOOD_ID = #foodID#  
  6. ﹤/update﹥ 

加入這個callback或typeHandler方法后,iBATIS抱怨沒見過這個標(biāo)記,程序不能啟動。把iBATIS升級為2.3.0,順便也把Spring升級為2.0.2,正常啟動。但是效果更差,所有數(shù)據(jù)均不能更新,且日志顯示只進(jìn)行了Prepare Statement,卻沒有執(zhí)行。

死馬當(dāng)活馬醫(yī):

  1. ﹤parameterMap id="updateByFoodIDPara" class="Food"﹥  
  2.   ﹤parameter property="foodDesc" jdbcType="CLOB" javaType="java.lang.String" /﹥  
  3.   ﹤parameter property="foodImage" jdbcType="BLOB" javaType="[B" /﹥  
  4.   ﹤parameter property="foodID" jdbcType="VARCHAR" javaType="java.lang.String" /﹥  
  5. ﹤/parameterMap﹥  
  6. ﹤update id="updateByFoodID" parameterMap="updateByFoodIDPara"﹥  
  7.   update TB_FOOD  
  8.     set FOOD_DESC = ?, FOOD_IMAGE = ?  
  9.     where FOOD_ID = ?  
  10. ﹤/update﹥ 

依舊未果。

使出殺手锏,把update封裝在一個存儲過程中(其中不需要特別的事務(wù)處理),然后將SQL Maps配置文件的對應(yīng)內(nèi)容簡簡單單的修改為:

  1. ﹤procedure id="updateByFoodID" parameterClass="Food"﹥  
  2.   {call pkg_xxx.sp_xxx (#foodID#, #foodDesc#, #foodImage#)}  
  3. ﹤/procedure﹥ 

OK!

iBATIS操作CLOB字段的問題還是要在實戰(zhàn)中多多總結(jié),希望這篇文章對你理解iBATIS操作CLOB字段有所幫助。

【編輯推薦】

  1. iBATIS標(biāo)簽詳解
  2. iBATIS是什么?
  3. iBATIS的優(yōu)、缺點及注意事項淺談
  4. iBATIS操作Blob與Clob淺析
  5. iBATIS讀寫CLOB數(shù)據(jù)淺析
責(zé)任編輯:仲衡 來源: 百度空間
相關(guān)推薦

2009-07-15 16:26:04

iBATIS Clob

2009-07-15 16:42:03

iBATIS讀寫CLO

2011-04-19 09:14:59

Ibatis

2009-07-21 11:12:00

iBATIS配置

2009-07-22 16:27:24

iBATIS配置類iBATIS操作類

2009-07-22 10:42:59

iBATIS Cach

2009-07-15 17:58:07

iBATIS 動態(tài)映射

2009-07-16 10:23:30

iBATIS工作原理

2009-07-16 09:14:26

iBATIS DAO

2009-07-15 17:19:31

iBATIS Ecli

2009-07-17 10:32:45

iBATIS MapB

2009-07-22 10:03:11

iBATIS Resu

2009-07-20 18:00:16

iBATIS DAO事

2009-07-20 13:47:08

iBATIS.NET字

2009-07-17 10:59:59

iBATIS接口

2009-07-17 09:44:40

iBATIS教程

2009-07-22 15:01:01

iBATIS SQLM

2009-07-22 16:02:14

iBATIS參數(shù)

2009-07-16 13:08:09

iBATIS快速創(chuàng)建應(yīng)

2009-07-22 15:21:00

iBATIS SQLM
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩成人国产 | 色香婷婷 | 羞羞视频在线观看免费观看 | 成人欧美一区二区三区黑人孕妇 | 欧美激情视频一区二区三区在线播放 | 国产精品一区二区在线免费观看 | 久久国产高清 | 久久99国产精一区二区三区 | www精品美女久久久tv | www久久 | 国产婷婷精品av在线 | 国产亚洲一区二区三区 | 国产欧美日韩精品一区 | 全部免费毛片在线播放网站 | 午夜视频一区二区 | 免费观看成人av | a级大片免费观看 | 请别相信他免费喜剧电影在线观看 | 亚洲精品一区二区三区四区高清 | 日韩成人在线免费视频 | 日本久久久久久 | 91亚洲一区 | 国产激情视频网址 | 欧美在线一区二区三区四区 | 在线日韩欧美 | 欧美精品1区2区3区 免费黄篇 | 欧美成人精品欧美一级 | 国产91在线播放 | 日韩视频在线观看一区二区 | 国产一区91精品张津瑜 | 亚洲一区二区三区在线播放 | 国产伦精品一区二区三区照片91 | 亚洲国产伊人 | 91精品国产综合久久久久久漫画 | 在线欧美亚洲 | 亚洲国产精品久久 | 成人国产一区二区三区精品麻豆 | 正在播放国产精品 | 一本一道久久a久久精品蜜桃 | 欧美日韩久久久久 | 欧美三级视频在线观看 |