Ⅰ kettle从oracle向mysql迁移大数据量时报错,求教
OGG全称为Oracle GoldenGate,是由Oracle官方提供的用于解决异构数据环境中数据复制的一个商业工具。相比于其它迁移工具OGG的优势在于可以直接解析源端Oracle的redo log,因此能够实现在不需要对原表结构做太多调整的前提下完成数据增量部分的迁移。本篇文章将重点介绍如何使用OGG实现Oracle到MySQL数据的平滑迁移,以及讲述个人在迁移过程中所碰到问题的解决方案。
(一)OGG逻辑架构
参照上图简单给大家介绍下OGG逻辑架构,让大家对OGG数据同步过程有个简单了解,后面章节会详细演示相关进程的配置方式,在OGG使用过程中主要涉及以下进程及文件:
Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等
Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全量、增量数据的抽取
Trails文件:临时存放在磁盘上的数据文件
Data Pump进程:运行在数据库源端,属于Extract进程的一个辅助进程,如果不配置Data Pump,Extract进程会将抽取的数据直接发送到目标端的Trail文件,如果配置了Data Pump,Extract进程会将数据抽取到本地Trail文件,然后通过Data Pump进程发送到目标端,配置Data Pump进程的主要好处是即使源端到目标端发生网络中断,Extract进程依然不会终止
Collector进程:接收源端传输过来的数据变化,并写入本地Trail文件中
Replicat进程:读取Trail文件中记录的数据变化,创建对应的DML语句并在目标端回放
二、迁移方案
(一)环境信息
OGG版本 OGG 12.2.0.2.2 For Oracle OGG 12.2.0.2.2 For MySQL
数据库版本 Oracle 11.2.0.4 MySQL 5.7.21
OGG_HOME /home/oracle/ogg /opt/ogg
(二)表结构迁移
表结构迁移属于难度不高但内容比较繁琐的一步,我们在迁移表结构时使用了一个叫sqlines的开源工具,对于sqlines工具在MySQL端创建失败及不符合预期的表结构再进行特殊处理,以此来提高表结构转换的效率。
注意:OGG在Oracle迁移MySQL的场景下不支持DDL语句同步,因此表结构迁移完成后到数据库切换前尽量不要再修改表结构。
(三)数据迁移
数据同步的操作均采用OGG工具进行,考虑数据全量和增量的衔接,OGG需要先将增量同步的抽取进程启动,抓取数据库的redo log,待全量抽取结束后开启增量数据回放,应用全量和增量这段期间产生的日志数据,OGG可基于参数配置进行重复数据处理,所以使用OGG时优先将增量进行配置并启用。此外,为了避免本章节篇幅过长,OGG参数将不再解释,有需要的朋友可以查看官方提供的Reference文档查询任何你不理解的参数。
1.源端OGG配置
(1)Oracle数据库配置
针对Oracle数据库,OGG需要数据库开启归档模式及增加辅助补充日志、强制记录日志等来保障OGG可抓取到完整的日志信息
查看当前环境是否满足要求,输出结果如下图所示:
(2)Oracle数据库OGG用户创建
OGG需要有一个用户有权限对数据库的相关对象做操作,以下为涉及的权限,该示例将创建一个用户名和密码均为ogg的Oracle数据库用户并授予以下权限
(3)源端OGG 管理进程(MGR)配置
(4)源端OGG 表级补全日志(trandata)配置
表级补全日志需要在最小补全日志打开的情况下才起作用,之前只在数据库级开启了最小补全日志(alter database add supplemental log data;),redolog记录的信息还不够全面,必须再使用add trandata开启表级的补全日志以获得必要的信息。
(5)源端OGG 抽取进程(extract)配置
Extract进程运行在数据库源端,负责从源端数据表或日志中捕获数据。Extract进程利用其内在的checkpoint机制,周期性地检查并记录其读写的位置,通常是写入到本地的trail文件。这种机制是为了保证如果Extract进程终止或者操作系统宕机,我们重启Extract进程后,GoldenGate能够恢复到以前的状态,从上一个断点处继续往下运行,而不会有任何数据损失。
(6)源端OGG 传输进程(pump)配置
pump进程运行在数据库源端,其作用非常简单。如果源端的Extract抽取进程使用了本地trail文件,那么pump进程就会把trail文件以数据块的形式通过TCP/IP协议发送到目标端,Pump进程本质上是Extract进程的一种特殊形式,如果不使用trail文件,那么Extract进程在抽取完数据后,直接投递到目标端。
补充:pump进程启动时需要与目标端的mgr进程进行连接,所以需要优先将目标端的mgr提前配置好,否则会报错连接被拒绝,无法传输抽取的日志文件到目标端对应目录下
(7)源端OGG 异构mapping文件(defgen)生成
该文件记录了源库需要复制的表的表结构定义信息,在源库生成该文件后需要拷贝到目标库的dirdef目录,当目标库的replica进程将传输过来的数据apply到目标库时需要读写该文件,同构的数据库不需要进行该操作。
2.目标端OGG配置
(1)目标端MySQL数据库配置
确认MySQL端表结构已经存在
MySQL数据库OGG用户创建
mysql> create user 'ogg'@'%' identified by 'ogg';
mysql> grant all on *.* to 'ogg'@'%';
#### 提前创建好ogg存放checkpoint表的数据库
mysql> create database ogg;
(2)目标端OGG 管理进程(MGR)配置
目标端的MGR进程和源端配置一样,可直接将源端配置方式在目标端重复执行一次即可,该部分不在赘述
(3)目标端OGG 检查点日志表(checkpoint)配置
checkpoint表用来保障一个事务执行完成后,在MySQL数据库从有一张表记录当前的日志回放点,与MySQL复制记录binlog的GTID或position点类似。
#### 切换至ogg软件目录并执行ggsci进入命令行终端
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit param ./GLOBALS
checkpointtable ogg.ggs_checkpoint
ggsci> dblogin sourcedb [email protected]:3306 userid ogg
ggsci> add checkpointtable ogg.ggs_checkpoint
(4)目标端OGG 回放线程(replicat)配置
Replicat进程运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML语句,然后应用到目标数据库中。
#### 切换至ogg软件目录并执行ggsci进入命令行终端
shell> cd $OGG_HOME
shell> ggsci
#### 添加一个回放线程并与源端pump进程传输过来的trail文件关联,并使用checkpoint表确保数据不丢失
ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint
#### 增加/编辑回放进程配置文件
ggsci> edit params r_cms
replicat r_cms
targetdb [email protected]:3306,userid ogg,password ogg
sourcedefs /opt/ogg/dirdef/cms.def
discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024
HANDLECOLLISIONS
MAP cms.*,target cms.*;
注意:replicat进程只需配置完成,无需启动,待全量抽取完成后再启动。
至此源端环境配置完成
待全量数据抽取完毕后启动目标端回放进程即可完成数据准实时同步。
3.全量同步配置
全量数据同步为一次性操作,当OGG软件部署完成及增量抽取进程配置并启动后,可配置1个特殊的extract进程从表中抽取数据,将抽取的数据保存到目标端生成文件,目标端同时启动一个单次运行的replicat回放进程将数据解析并回放至目标数据库中。
(1)源端OGG 全量抽取进程(extract)配置
#### 切换至ogg软件目录并执行ggsci进入命令行终端
shell> cd $OGG_HOME
shell> ggsci
#### 增加/编辑全量抽取进程配置文件
#### 其中RMTFILE指定抽取的数据直接传送到远端对应目录下
#### 注意:RMTFILE参数指定的文件只支持2位字符,如果超过replicat则无法识别
ggsci> edit params ei_cms
SOURCEISTABLE
SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")
SETENV (ORACLE_SID=cms)
SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)
USERID ogg@appdb,PASSWORD ogg
RMTHOST 17X.1X.84.121,MGRPORT 7809
RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge
TABLE cms.*;
#### 启动并查看抽取进程正常
shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &
## 查看日志是否正常进行全量抽取
shell> tail -f ./dirrpt/ei_cms.rpt
(2)目标端OGG 全量回放进程(replicat)配置
#### 切换至ogg软件目录并执行ggsci进入命令行终端
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit params ri_cms
SPECIALRUN
END RUNTIME
TARGETDB [email protected]:3306,USERID ogg,PASSWORD ogg
EXTFILE /opt/ogg/dirdat/ms
DISCARDFILE ./dirrpt/ri_cms.dsc,purge
MAP cms.*,TARGET cms.*;
#### 启动并查看回放进程正常
shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &
#### 查看日志是否正常进行全量回放
shell> tail -f ./dirrpt/ri_cms.rpt
三、数据校验
数据校验是数据迁移过程中必不可少的环节,本章节提供给几个数据校验的思路共大家参数,校验方式可以由以下几个角度去实现:
1.通过OGG日志查看全量、增量过程中discards记录是否为0来判断是否丢失数据;
2.通过对源端、目标端的表执行count判断数据量是否一致;
3.编写类似于pt-table-checksum校验原理的程序,实现行级别一致性校验,这种方式优缺点特别明显,优点是能够完全准确对数据内容进行校验,缺点是需要遍历每一行数据,校验成本较高;
4.相对折中的数据校验方式是通过业务角度,提前编写好数十个返回结果较快的SQL,从业务角度抽样校验。
四、迁移问题处理
本章节将讲述迁移过程中碰到的一些问题及相应的解决方式。
(一)MySQL限制
在Oracle到MySQL的表结构迁移过程中主要碰到以下两个限制:
1. Oracle端的表结构因为最初设计不严谨,存在大量的列使用varchar(4000)数据类型,导致迁移到MySQL后超出行限制,表结构无法创建。由于MySQL本身数据结构的限制,一个16K的数据页最少要存储两行数据,因此单行数据不能超过65,535 bytes,因此针对这种情况有两种解决方式:
根据实际存储数据的长度,对超长的varchar列进行收缩;
对于无法收缩的列转换数据类型为text,但这在使用过程中可能导致一些性能问题;
2. 与第一点类似,在Innodb存储引擎中,索引前缀长度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且开启innodblargeprefix的场景下,这个限制是3072 bytes,即使用utf8mb4字符集时,最多只能对varchar(768)的列创建索引;
3. 使用ogg全量初始化同步时,若存在外键约束,批量导入时由于各表的插入顺序不唯一,可能子表先插入数据而主表还未插入,导致报错子表依赖的记录不存在,因此建议数据迁移阶段禁用主外键约束,待迁移结束后再打开。
mysql>set global foreign_key_checks=off;
(二)全量与增量衔接
HANDLECOLLISIONS参数是实现OGG全量数据与增量数据衔接的关键,其实现原理是在全量抽取前先开启增量抽取进程,抓去全量应用期间产生的redo log,当全量应用完成后,开启增量回放进程,应用全量期间的增量数据。使用该参数后增量回放DML语句时主要有以下场景及处理逻辑:
目标端不存在delete语句的记录,忽略该问题并不记录到discardfile
目标端丢失update记录
- 更新的是主键值,update转换成insert
- 更新的键值是非主键,忽略该问题并不记录到discardfile
目标端重复insert已存在的主键值,这将被replicat进程转换为UPDATE现有主键值的行
(三)OGG版本选择
在OGG版本选择上我们也根据用户的场景多次更换了OGG版本,最初因为客户的Oracle 数据库版本为11.2.0.4,因此我们在选择OGG版本时优先选择使用了11版本,但是使用过程中发现,每次数据抽取生成的trail文件达到2G左右时,OGG报错连接中断,查看RMTFILE参数详细说明了解到trail文件默认限制为2G,后来我们替换OGG版本为12.3,使用MAXFILES参数控制生成多个指定大小的trail文件,回放时Replicat进程也能自动轮转读取Trail文件,最终解决该问题。但是如果不幸Oracle环境使用了Linux 5版本的系统,那么你的OGG需要再降一个小版本,最高只能使用OGG 12.2。
(四)无主键表处理
在迁移过程中还碰到一个比较难搞的问题就是当前Oracle端存在大量表没有主键。在MySQL中的表没有主键这几乎是不被允许的,因为很容易导致性能问题和主从延迟。同时在OGG迁移过程中表没有主键也会产生一些隐患,比如对于没有主键的表,OGG默认是将这个一行数据中所有的列拼凑起来作为唯一键,但实际还是可能存在重复数据导致数据同步异常,Oracle官方对此也提供了一个解决方案,通过对无主键表添加GUID列来作为行唯一标示,具体操作方式可以搜索MOS文档ID 1271578.1进行查看。
(五)OGG安全规则
报错信息
2019-03-08 06:15:22 ERROR OGG-01201 Error reported by MGR : Access denied.
错误信息含义源端报错表示为该抽取进程需要和目标端的mgr进程通讯,但是被拒绝,具体操作为:源端的extract进程需要与目标端mgr进行沟通,远程将目标的replicat进行启动,由于安全性现在而被拒绝连接。
报错原因
在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要远程启动目标端的replicat进程,需要在mgr节点增加访问控制参数允许远程调用
解决办法
在源端和目标端的mgr节点上分别增加访问控制规则并重启
## 表示该mgr节点允许(ALLOW)10.186网段(IPADDR)的所有类型程序(PROG *)进行连接访问ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW
(六)数据抽取方式
报错信息
2019-03-15 14:49:04 ERROR OGG-01192 Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').
报错原因
根据官方文档说明,当前直接通过Oracle数据库抽取数据写到MySQL这种initial-load方式,不支持LOBs数据类型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 则包含了CLOB字段,无法进行传输,并且该方式不支持超过4k的字段数据类型
解决方法
将抽取进程中的RMTTASK改为RMTFILE参数 官方建议将数据先抽取成文件,再基于文件数据解析进行初始化导入
Ⅱ 大数据开发中执行sql处理大量数据前怎么测试sql写的对不对
要保存数抄据到数据库,VB自带的功能是无法完成的,除非你用普通的文件保存数据。
用ADO相对简单,对于你的问题只要一个Connection对象。用它连接数据库,用它的Execute方法来执行更新数据的SQL语句。
如果你的输入跟数据库字段直接对应,也可以使用数据绑定的办法,用ADODC控件获取数据,并将文本框跟ADODC绑定。
Ⅲ 如何实现在线更新SQL Server千万级记录大表
还需要看你硬盘读写速度 7200转的话应该4千万左右为大数据的阈值 BulkCopy
小于4000万的话,起事务批量更新,在线的话,你需要做一个主从库,从库用来读,就不会影响到用户访问
Ⅳ mysql大数据批量更新,字段concat追加字符串,越来越慢怎么解决
取决于字段=concat_ws.
这个字段有没有索引
+
会不会需要被索引.
'''
如是道(提问者回)
没有索引,不需要被索引。
'''
如果是这答样,
就应该把这个字段丢到另外一张表,
基本上原则就是"separate
what
varies
from
what
stays
the
same."
。
Ⅳ ORACLE怎么批量UPDATE
excel导入ORACLE的四个方法
EXCEL里导入ORACLE有四种方法,
1 使用sql *loader
SQL*LOADER是oracle的数据加载工具,在NT下sql*loader的命令为SQLLDR,在UNIX下一般为SQLLDR/SQLLOAD。通常用来将操作系统文件迁移到oracle数据库中。它是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(direct,parallel)。但这种方法要求存储数据的oracle表是已经存在的。
使用这种方法导入excel内容到oracle时,首先需要将excel文件另存为文本格式,文件类型选文本类型或者csv类型即将e:\test.xls另存为e:\test.csv。
如果oracle没有对应存储数据的表结构,则需要创建表test(id,name,telphone)。
用记事本创建sql*loader控制文件test.ctl(ctl后缀是企图证明这是一个控制文件,但实际上这个文件后缀不重要,用户可以自由选择,但文件格式一定要是文本格式),内容如下:
Load data
Infile ‘e:\test.csv’ --数据源文件名称
Append|insert|replace --append在表后追加,insert插入空表,replace替代原有内容
Into table test --要导入的数据库表名称
[when id = id_memo] --过滤条件
Fields terminated by X’09’ --字段分隔符
(id,name,telphone) --字段名称列表
最后在命令窗口输入sqlldr命令行执行导入操作Sqlldr userid = system/manager control=’e:\test.ctl’
Sqlldr的函数关键字说明:
Userid --oracle用户名 userid = username/password
Control --控制文件名称 control = ‘e:\insert.ctl’
Log –-日志文件名称 log = ‘e:\insert.log’
Bad --损坏文件名称
Data --data file name
Discard --discard file name
Discardmax --number of discards to allow(默认全部)
Skip --导入时跳过的记录行数(默认0)
Load --导入时导入的记录行数(默认全部)
Errors --允许错误的记录行数(默认50)
2 使用plsql developer
PL/SQL Developer是一种专门用于开发、测试、调试和优化oracle PL/SQL存储程序单元,比如触发器,存储过程,函数和程序包等集成开发环境。
在单个文件数据不多(小于10w行),并且目的表结构已经存在的情况下可以使用plsql developer工具将excel内容直接通过简单的,paste操作导入oracle数据库。具体操作方式如下:
l 在plsql developer的sql window里输入select * from test for update,其中test是要导入的oracle数据表名称;
l 执行查询(通过点击按钮或者快捷键F8可以实现);
l 点击查询结果上面的锁状按钮,使得查询到的内容处于编辑状态。
l 从excel数据表中(ctrl +C)要导入oracle中的数据,如果是单列数据导入,可以先按plsql developer中查询结果上面的“添加(+)”按钮,使得数据表处于添加数据状态,然后将鼠标在plsql developer的列名称上单击,最后使用快捷键ctrl + v 完成数据导入操作,并单击plsql developer中的“提交(对号)”按钮提交所做的修改。
l 如果是同时导入所有列,首先选择所有数据,然后点增加(+)并点击编辑那一行最前面的星号使得整行数据都处于被选择状态,最后paste即可将数据导入。
l 如果分列导入数据,则需要逐列完成,首先选择要导入的数据,然后然后点增加(+)并点击编辑那一列的名称,使得整列数据都处于被选择状态,最后paste即可将数据导入。
使用PLSQL developer执行数据的导入和导出操作主要存在的问题是在大数据量情况下对中文数据可能出错,估计将接收数据表的类型定义为nvarchar2的类型会比较好一点。另外,就是这种方法需要人工更多的参与,不能达到自动导入的效果。
3 使用破解版的XLSTOORACLE,这个工具最简单了,快捷方便,强烈推荐之!
Ⅵ sql server如何批量更新数据。
update表名setvalue=casewhenid=1then一个值
whenid=2then一个值
whenid=3then一个值elsevalue
end
上边就是举个例子,意思是,当id=1时,把专value设定个值,当id=2时,value设定另一属个值,依次类推,不需要更改的保留原来的value值,最后以end结尾
Ⅶ 关于sql数据库数据同步更新的问题
环境:两台windows xp系统机器,并且安装同一版本的数据库5.0.17
两台机器Ip
A:173.26.100.62
B:173.26.100.61
此例为A为主服务器,B为从服务器,A服务器上的数据变更会更新到B服务器数据库当中
步骤:
1 .A机器上创建数据库tsas,设置数据库访问权限,也就是创建一个用户和密码,目的在于在B机器上用创建的这个用户能够正常连接A机器的数据库。
grant file on *.* to backup@'173.26.100.61' identified by '1234';
2.在A服务器的mysql目录下编辑my.ini,加入如下语句:
server-id=1
log-bin=C:\mysqlbak\log-bin.log
3.重起A机器,可以用命令show master status 察看状态
4 设置B服务器,打开B机器mysql目录下的my.ini,加入以下语句:
server-id=2
master-host=173.26.100.62
master-user=backup #同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=60 预设重试间隔60秒
replicate-do-db=tsas 告诉slave只做backup数据库的更新
5.重新启动B机器,可以用命令 show slave status察看B机器状态
6.测试:
向A批量插入大数据量数据,那么在B机器当中察看相关的表格,B机器与A机器中的数据是一致的,这样就可以达到B机器同步A机器的数据。
Ⅷ 关于mysql大数据查询,修改。请问有什么方法可以保证性能
MySQL一个表100万记录不算大,我用到过单表中上亿的记录,只要规划好,一样的飞快。
第一考虑在大吞吐情况下的数据安全,按照个人经验,第一推荐选用Innodb的方式,MyISAM的引擎虽然查询高效,但是在高I/O的情况下,一旦出问题,如何进行数据修复是让人崩溃的事情。而且Innodb支持事务,如果执行不成功,会自动回滚。
第二如果你的数据表基本上都是程序在访问,那么在定制索引的时候要好好考虑一下,把你常用的检索条件在一起做复合索引,这会比分离的单键索引在数度上是数量级的提高。还有就是在你的程序里面约定好筛选条件的顺序,这个顺序一定要和你定制的复合索引从左到右一致。
第三如果你的程序牵扯到多表的联合,建议使用存储过程,这样避免在TCP/IP I/O资源的堵塞,另外存储过程的使用过程中和具体使用的表之间的索引优化。针对特别常见的组合也可以使用view的方式创建。
第四在程序里面使用SQL要遵循如下经验:
- 不要在程序里面对SQL使用循环,或把可以通过SQL计算的东西让程序处理,尽量把运算交给MySQL服务器去做
- 使用SQL的时候尽量符合自己表定义索引,不要已经索引的字段进行函数计算,这样会导致索引无效
其实性能主要是靠前期的规划,规划设计好,无论是数据库和客户端都按照规划去做,性能一般差不了哪里去。
Ⅸ 如何处理大量数据并发操作
处理大量数据并发操作可以采用如下几种方法:
1.使用缓存:使用程序直接保存到内存中。或者使用缓存框架: 用一个特定的类型值来保存,以区别空数据和未缓存的两种状态。
2.数据库优化:表结构优化;SQL语句优化,语法优化和处理逻辑优化;分区;分表;索引优化;使用存储过程代替直接操作。
3.分离活跃数据:可以分为活跃用户和不活跃用户。
4.批量读取和延迟修改: 高并发情况可以将多个查询请求合并到一个。高并发且频繁修改的可以暂存缓存中。
5.读写分离: 数据库服务器配置多个,配置主从数据库。写用主数据库,读用从数据库。
6.分布式数据库: 将不同的表存放到不同的数据库中,然后再放到不同的服务器中。
7.NoSql和Hadoop: NoSql,not only SQL。没有关系型数据库那么多限制,比较灵活高效。Hadoop,将一个表中的数据分层多块,保存到多个节点(分布式)。每一块数据都有多个节点保存(集群)。集群可以并行处理相同的数据,还可以保证数据的完整性。
拓展资料:
大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》中大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。
Ⅹ hibernate如何避免复杂查询,优化大数据,和批量sql语句求答案
------解决方案--------------------------------------------------------
Hibernate 是一个优秀的 ORM 框架,但不是高效的。
大数据量的查询,以及需要使用本地数据库语言对 SQL 进行逐步调优的应用不适合使用 Hibernate
------解决方案--------------------------------------------------------
仅仅是查询,没有问题。hibernate的分页也已经针对不同的数据库进行了优化的
比如oracle,hibernate就采用的是oracle最快的分页方式,具体的可以去看OracleDialect源代码
其他的数据库也是
get或者load是获取一条数据,这里都需要用延迟加载的
批量sql的时候,需要设置batch size,并且关闭二级缓存,同时使用flush来同步数据库,在使用clear来清空session缓存,这样不至于内存溢出
,hibernte文档上有这个例子
或者用存储过程,如果你了解hibernate你就会用他的长处,而避免其短处
------解决方案--------------------------------------------------------
hibernate的查询缓存key是查询语句,但是key对应的value其实是数据库表的主键
当查询被缓存后,再次调用查询的时候,通过key找到对应的id集合,然后一个一个的去class缓存中去load
class里没有,再去数据库中获取。所以这又涉及到类缓存上了,当用hibernate进行数据库的修改和删除等操作的时候,都会更新一二级缓存,所以查询缓存会获取最新的数据
------解决方案--------------------------------------------------------