XMLTable使用实践

最近在项目中遇到了一个使用XMLTable解决问题的实践。现总结如下:

环境

  • DB:Oracle11g
  • ORM:iBatis

BUG现象

问题其实很简单,就是我们在项目中使用了很多超级长的SQL语句,之后导致SQL执行效率低下,并且貌似导致了Oracle的SQL编译空间益出了。

出问题的SQL:

SELECT N1,N2FROM A1WHERE    (N1='1' AND N2='a1') OR    (N1='2' AND N2='a2') OR    (N1='3' AND N2='a3') OR    (N1='4' AND N2='a4') OR....省略2万行

BUG解析

当然了真实的SQL文是不可能这么简单的,比这个要复杂的多。不过出问题的部分基本就是这样了,其实原来没用AND/OR这种结构,用的是IN,但IN语句的参数不能超过2000个。所以就改成这个结构了,这个结构传东西到是没有限制了,但是会导致SQL文变长,而且由于数据的长度不定。这些1和a1是前面产生的结果,所以不一定有多少组。所以都是直接拼在SQL里了。问题很明显,后果很严重。

BUG解决

因为系统已经开发很长时间了,不能进行太大的改动。老系统就这样,改的越多,错的越多,狂改代码基本属于自虐行为。

所以我们引入了XMLTable来解决这个问题,这还是一个DBA给的建议呢。

SELECT N1,N2FROM A1WHERE (N1,N2) IN (    SELECT X1,X2 FROM        XMLTable('for $i in /T/REC return $i' PASSING XMLType(#str:CLOB#)        COLUMNS X1 INTEGER PATH 'X1',        X2 CHAR(2) PATH 'X2')

因为使用iBatis的缘故,所以我使用了一个叫str的参数,并且声明为CLOB类型的,但str里放什么呢?

<T>    <REC><X1>1</X1><X2>a1</X2></REC>    <REC><X1>2</X1><X2>a2</X2></REC>    ....</T>

这个很明白了吧,就是把需要的数据通过XML的形式变成一个表,之后再和主表进行子查询进行关联。这样做的好处就是把SQL文的长度变换为参数的长度了,虽然参数变长了,但SQL文本身变短了。

总结

真正做的时候还遇到了一些问题:

首先,使用这个SQL的时候必须要在一个事务里,虽然他只是查询,但一定要在事务里否则会出错。

因为咱们程序里使用了CLOB数据,所以要加载以下的Bean

<bean id="simpleExtractor"       class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"></bean><bean id="oracleLobHandler"       class="org.springframework.jdbc.support.lob.OracleLobHandler">    <property name="nativeJdbcExtractor" ref="simpleExtractor"/></bean>

SQLMap里需要加一个CLOB的TypeHandler,之后在变量里声明一下#str:CLOB#就可是了。

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

但还有一点需要注意,我查了很长时间,因为$在iBatis里是关键字,这个关键字如果需要输出的话就需要转义,就要使用$代表一个$当然#也是同理的。

转载于:https://www.cnblogs.com/tjpanda88/archive/2011/08/20/2147543.html

XMLTable使用实践相关推荐

  1. Golang TDD实践报告:快速排序Quick Sort

    Golang TDD实践报告:快速排序Quick Sort [阅读时间:约5分钟] 0.项目需求 1.编写符合项目输入输出的一个测试 2.尝试运行测试 3.先使用最少的代码来让失败的测试先跑起来 4. ...

  2. 编写高性能Java代码的最佳实践

    编写高性能Java代码的最佳实践 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践.最后研究了JVM特定的调优技巧.数据库端的优化和架 ...

  3. 【K8S实践】关于Kubernetes Dashboard的实践学习

    前言: 陆陆续续,学k8s一个月了,从开始看docker容器书,视频,怎么都无法上手:到后来闷着头实践地傻瓜式操作:到今天整个完全串通好!感觉到学习也是一段深刻的成长经历! 过程: 这个过程中使用的工 ...

  4. 提高期——SLA实践指导秘籍

    前言: 第二遍看提高期的SLA文档,开始提高期的第一个项目. 感受: 这个秘籍和自己看的<番茄工作法图解>非常像,写作风格和内容量上. 从大脑的功能分析,为什么要这样做.我们的学习方法符合 ...

  5. Spring Data JPA 五分钟快速入门和实践

    Spring Data JPA(类似于Java Web 中的 DAO) 操作声明持久层的接口(Repository) 三个核心接口: CrudRepository PagingAndSortingRe ...

  6. TVM优化c++部署实践

    TVM优化c++部署实践 使用TVM导入神经网络模型: 模型支持pytorch , tensorflow , onnx, caffe 等.平时pytorch用的多,这里给一种pytorch的导入方式. ...

  7. Dockerfile构建实践

    Dockerfile构建实践 本文介绍了用于构建有效图像的推荐最佳实践和方法. Docker通过从一个Dockerfile文本文件中读取指令来自动构建映像,该文本文件按顺序包含构建给定映像所需的所有命 ...

  8. Tensor基础实践

    Tensor基础实践 飞桨(PaddlePaddle,以下简称Paddle)和其他深度学习框架一样,使用Tensor来表示数据,在神经网络中传递的数据均为Tensor. Tensor可以将其理解为多维 ...

  9. MindSpore模型精度调优实践

    MindSpore模型精度调优实践 引论:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,为MindSpore量身定做了可视化调试调优组件:MindInsight. ...

最新文章

  1. 有java基础的人学python_准备自学Python ,会java,有什么建议吗?
  2. 深度学习Github排名,很不错的介绍
  3. [C#参考]锁定lock
  4. Spring如何解决循环依赖问题
  5. Swift之深入解析如何自定义操作符
  6. 【终极方法】This method must return a result of type boolean
  7. 十几行程序代码搞定 Master-Detail GridView(内含子 GridView)
  8. 内存泄漏和内存溢出的优化
  9. python response.json_Python - Django - JsonResponse 对象
  10. python编程快速上手第三章_Python编程快速上手 往让繁琐工作自动化-6.6 习题(示例代码)...
  11. [设计纹理素材]可爱手绘淡雅清新图案花样背景素材
  12. CSDN写博客怎么插入数学公式(干货满满呦)
  13. JavaScript中使鼠标光标变为图片
  14. golang 使用 goquery 抓取 知乎周刊
  15. 华为2019校招实习笔试-软件题
  16. 【数字电子技术 Digital Electronic Technology 4】——门电路笔记 之 TTL门电路详细剖析
  17. 如何做一名有趣的家长?
  18. webpack的loader与plugin原理
  19. 第三阶段:Web前端:01Web(HTML、CSS、JavaScript)
  20. Oracle出现 ins 35075提示的解决方法

热门文章

  1. python搬运youtube视频到大鱼_【具体介绍请点开详细】大鱼 绯闻外援 矿工泰森·弗兰达 集锦(油管搬运)...
  2. MultiDex加载流程分析
  3. android如何定时息屏_手机息屏显示时间如何设置?其实息屏显示App也能帮你实现...
  4. 我们怎样才能学会?做一个学者或学生?
  5. CSDN 编程竞赛二十七期题解
  6. 华为4G智能机Assend Mate2定价三千元左右
  7. 破解阿里旺旺的登录限制 今天帐号数超过限制,频繁登录
  8. 筹建计算机学院,计算机学院召开“三思”院刊筹备会
  9. 攻防世界-easyphp
  10. 优莎纳见证一 usana减肥、经期综合症