0 0

定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?谢谢各位大侠!5

定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?谢谢各位大侠!

问题补充:这个操作不是在数据库中哦,是在程序中操作数据库哦,用java操作。
housen1987 写道
考虑一下几种方法:

将源表同步到目标数据库(改成一个临时表)

方法一: 两个表数据量都不大的情况下,使用union关键字去掉重复数据后,把得到的数据重建建一张表,删除以前的表,改名为目标表。
方法二: 数据量稍大,使用minus关键字,获取存在于源表但不存在于目标表的数据,然后将的到的差集一条一条地插进目标表。
方法三: 目标表建立索引,查询出源表当中不存在于目标表的数据(使用exists关键字,不要用in),然后将得到的数据一条条地插入到目标表中。

以上方法,如果是在oracle数据库中,建议使用pl/sql程序完成,速度快!


问题补充:这两个表不是在同一个数据库的,一个在oracle,另一个在sybase,是这种情况,把oracle中的表数据存到sybase表中,在大数据量情况下要考虑性能,定时任务不要读已经拿到的数据,只要拿新增的数据,然后存到sybase中!
housen1987 写道
引用
这个操作不是在数据库中哦,是在程序中操作数据库哦,用java操作。

一样的,程序也操作数据建表,使用pl/sql程序,做集合运算等操作,我说的是大部分操作使用数据库完成,这样能显著提高效率,如果只是用java程序的话,那考虑下面两种方法:

1 源表中的数据一条一条地取出来,对比目标表,实现不重复插入;

2 两个表的数据都取出来,采用内存hash join的方式,得到源表-目标表的差集数据,然后插入到目标表中


问题补充:理解我的问题有点偏差哦,不用比较目标表,我从oracle中取到新增的数据就行了,我打个比喻吧:假设我第一次读取oracle表是要全表读的,设定定时时间为1分钟,一分钟后我又要读oracle中的数据,那么第一次读的数据就不用第二次再读一遍,而是只读这一分钟内有哪些新增的数据,取得新增的数据插入到sybase表中,因为两张表数据一样,取得oracle中的新增数据也是sybase没有的数据,所以不用比较sybase中的数据,直接插入!
housen1987 写道
引用

这两个表不是在同一个数据库的,一个在oracle,另一个在sybase,是这种情况,把oracle中的表数据存到sybase表中,在大数据量情况下要考虑性能,定时任务不要读已经拿到的数据,只要拿新增的数据,然后存到sybase中!


我还想问一个问题,重复数据是oracle表数据有重复,还是oracle表与sybase表的数据有重复?

如果是oracle表数据有重复,这个最好办,oracle的数据查询出来,使用distinct或union select * from dual一下,就能把重复数据去掉了。

如果是oracle表与sybase表的数据有重复,那么在不读取sybase表的情况下,怎么知道oracle表中哪些数据是重复数据呢?


问题补充:这次你应该清楚了我的问题了,很高兴,表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗?
housen1987 写道
引用

理解我的问题有点偏差哦,不用比较目标表,我从oracle中取到新增的数据就行了,我打个比喻吧:假设我第一次读取oracle表是要全表读的,设定定时时间为1分钟,一分钟后我又要读oracle中的数据,那么第一次读的数据就不用第二次再读一遍,而是只读这一分钟内有哪些新增的数据,取得新增的数据插入到sybase表中,因为两张表数据一样,取得oracle中的新增数据也是sybase没有的数据,所以不用比较sybase中的数据,直接插入!


oracle表中增加读取标识位字段,默认为0,已经同步过的,设置标识位为1,下次oracle表再有新数据增加的话,那么只读标识位为0的就可以了。

如果不想破坏oracle表的结构,自己在oracle上新增一个临时表,来存储已经同步过的oracle数据的主键标识也行。


问题补充:嗯,非常感谢您的耐心回答,我现在的情况完全就是你假设的那种,A,B,C三个点进行数据同步,虽然问题还待一步解决,但我还是采纳您的回答!
housen1987 写道
引用

这次你应该清楚了我的问题了,很高兴,表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗?


这个真的是比较困难。

首先,你要从客户机oracle取数据,因为这1分钟间隔之内不知道用户机新增加了哪些数据(大部分情况下是用户使用别的系统插入数据,而你又没有这个系统的程序接口),所以你只能全部取出来,依靠自己的程序去同步数据。

我见过的做法是:

假设用户机是A(Oracle),你的java应用部署在B机器上,sybase数据库在C机器上。

(1)B机器上安装一个内存数据库(有一个开源的H2内存数据库)
(2)获取A(Oracle)的全部数据,如果B机器的内存不大,那么分批获取也可以,与B机器上的内存数据库中的临时储存表Temp做hash join,得到增量数据。
(3)把增量数据同步到B机器的内存数据库和C机器的sybase上。

这里,说明一下,需要同步的表是每隔一段时间会重新建立的,比如天表、月表等,所以一个表不会超级大,达到内存无法消化的地步,所以这个内存数据库的临时表也是有一定的容量的。

可能还有更好的方式,不过,中间表或中间文件记录应该还是要的。

 
2012年1月06日 15:14

5个答案 按时间排序 按投票排序

0 0

采纳的答案

引用

这次你应该清楚了我的问题了,很高兴,表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗?


这个真的是比较困难。

首先,你要从客户机oracle取数据,因为这1分钟间隔之内不知道用户机新增加了哪些数据(大部分情况下是用户使用别的系统插入数据,而你又没有这个系统的程序接口),所以你只能全部取出来,依靠自己的程序去同步数据。

我见过的做法是:

假设用户机是A(Oracle),你的java应用部署在B机器上,sybase数据库在C机器上。

(1)B机器上安装一个内存数据库(有一个开源的H2内存数据库)
(2)获取A(Oracle)的全部数据,如果B机器的内存不大,那么分批获取也可以,与B机器上的内存数据库中的临时储存表Temp做hash join,得到增量数据。
(3)把增量数据同步到B机器的内存数据库和C机器的sybase上。

这里,说明一下,需要同步的表是每隔一段时间会重新建立的,比如天表、月表等,所以一个表不会超级大,达到内存无法消化的地步,所以这个内存数据库的临时表也是有一定的容量的。

可能还有更好的方式,不过,中间表或中间文件记录应该还是要的。

2012年1月06日 20:13
0 0

引用

理解我的问题有点偏差哦,不用比较目标表,我从oracle中取到新增的数据就行了,我打个比喻吧:假设我第一次读取oracle表是要全表读的,设定定时时间为1分钟,一分钟后我又要读oracle中的数据,那么第一次读的数据就不用第二次再读一遍,而是只读这一分钟内有哪些新增的数据,取得新增的数据插入到sybase表中,因为两张表数据一样,取得oracle中的新增数据也是sybase没有的数据,所以不用比较sybase中的数据,直接插入!


oracle表中增加读取标识位字段,默认为0,已经同步过的,设置标识位为1,下次oracle表再有新数据增加的话,那么只读标识位为0的就可以了。

如果不想破坏oracle表的结构,自己在oracle上新增一个临时表,来存储已经同步过的oracle数据的主键标识也行。

2012年1月06日 18:16
0 0

引用

这两个表不是在同一个数据库的,一个在oracle,另一个在sybase,是这种情况,把oracle中的表数据存到sybase表中,在大数据量情况下要考虑性能,定时任务不要读已经拿到的数据,只要拿新增的数据,然后存到sybase中!


我还想问一个问题,重复数据是oracle表数据有重复,还是oracle表与sybase表的数据有重复?

如果是oracle表数据有重复,这个最好办,oracle的数据查询出来,使用distinct或union select * from dual一下,就能把重复数据去掉了。

如果是oracle表与sybase表的数据有重复,那么在不读取sybase表的情况下,怎么知道oracle表中哪些数据是重复数据呢?

2012年1月06日 17:36
0 0

引用
这个操作不是在数据库中哦,是在程序中操作数据库哦,用java操作。

一样的,程序也操作数据建表,使用pl/sql程序,做集合运算等操作,我说的是大部分操作使用数据库完成,这样能显著提高效率,如果只是用java程序的话,那考虑下面两种方法:

1 源表中的数据一条一条地取出来,对比目标表,实现不重复插入;

2 两个表的数据都取出来,采用内存hash join的方式,得到源表-目标表的差集数据,然后插入到目标表中

2012年1月06日 16:21
0 0

考虑一下几种方法:

将源表同步到目标数据库(改成一个临时表)

方法一: 两个表数据量都不大的情况下,使用union关键字去掉重复数据后,把得到的数据重建建一张表,删除以前的表,改名为目标表。
方法二: 数据量稍大,使用minus关键字,获取存在于源表但不存在于目标表的数据,然后将的到的差集一条一条地插进目标表。
方法三: 目标表建立索引,查询出源表当中不存在于目标表的数据(使用exists关键字,不要用in),然后将得到的数据一条条地插入到目标表中。

以上方法,如果是在oracle数据库中,建议使用pl/sql程序完成,速度快!

2012年1月06日 15:27

相关推荐

    从数据库取数据动态生成菜单

    根据网上大侠的模板修改,从后台数据库取值生成菜单,本人菜鸟,共同进步吧。

    常用的几个微软数据库的简单用法

    常用的几个微软数据库的简单用法,主要简单介绍MICROSFT SERVER 2000\2005\2008、ACCESS 2003\2007、EXCEL 2003\2007、XML在ASP.NET中数据库展示控件和数据源的简单用法,有不足之处,请各路大侠指证。

    晴窗中文大侠 V6.0.9.109 (集成开发版)加强版

    晴窗中文大侠给用户提供了一个字典编辑器,用户可以根据自己的习惯对翻译的内容进行修改和增补。 “翻译专业化、功能人性化、一切为用户着想”一直是晴窗中文大侠孜孜追求的目标,为了感谢您对晴窗软件的支持,我们...

    SQL 数据库大学基础数据查询练习(一)易

    适合刚入门数据库的学生,一些查询联系的过程与结果。 大学老师布置的实训报告。 涉及以下知识点: 1.列出表的所有字段 2."*" 符号表示所有字段 3.查询指定字段数据 4.DISTINCT 查询 5.IN 查询 6.BETWEEN AND 查询 7...

    晴窗中文大侠 ChineseHome V6.0.13.137 (集成开发版)加强版

    晴窗中文大侠采用的是专业词库对照翻译模式,即一套目标软件就有一个和目标软件相对应的专业字典包.保证了翻译后的效果精确。晴窗中文大侠基本支持所有CG专业软件,几乎囊括了目前中国市面上所有常用的关于平面设计...

    数据库依赖缓存

    简单说了下数据库的数据依赖缓存,这个其实我也没搞懂.只是做了个简单的介绍.还有一个简单的Demo.数据库自建吧.里面有用到linq的DBML.  --本人只是入门级菜鸟,资源免费.大侠们别嘲笑,别打击我好学的积极性.

    晴窗中文大侠6.09破解版

    晴窗中文大侠6.09破解版  《晴窗中文大侠》的翻译技术是使用界面动态翻译技术,即完全是在目标软件工作运行时,动态完成翻译工作。不会影响目标软件原有的运行速度。因为在工作时,只是对目标软件在有文字输出时才...

    晴窗中文大侠4.2注册机

    晴窗中文大侠4.2注册机,提供注册码 晴窗中文大侠4.2注册机,提供注册码 晴窗中文大侠4.2注册机,提供注册码

    晴窗中文大侠6.rar

    晴窗中文大侠6.rar

    晴窗中文大侠5.0钻石版

    晴窗中文大侠5.0钻石版forXPsp2补丁 晴窗中文大侠5.0钻石版forXPsp2补丁 晴窗中文大侠5.0钻石版forXPsp2补丁

    词法分析 编译原理(包含完整数据库)

    词法分析 编译原理(包含完整数据库) SQL数据库 需要根据自己修改连接字符串(大侠们都懂的)

    空间数据库做的一个小gis系统

    通过ADO连接数据库 能画点 画线 画区 而且可以选择类型 同时可以在SQO server中操作

    sql2000数据库快捷键大全

    计算机专业人士必须具备的数据库既能,本文档涵盖了sqlServer2000数据快捷键比较全的操作。希望能够对各位大侠有所帮助。

    linux修改mysql数据库文件的路径

    mysql更改数据文件的存放路径感觉直接把/etc/my.cnf中的datadir改一下重启一下服务就行,但是从网上搜了n多资料,大部分都是更改my.cnf中的datadir及sock及启动脚本/etc/rc.d/init/mysqld中的datadir,按照网上提供...

    三级数据库模拟考试系统

    三级数据库的模拟考试系统。没有注册码,但是有一个月的试用期。试用期到后可以卸载后再重装即可继续使用。

    晴窗中文大侠6.0开发版

    晴窗中文大侠6.0开发版 汉化…………

    晴窗中文大侠 5 开发版

    选择晴窗中文大侠5.0的理由: -精确汉化各种大型英文软件;  -系统资源占用较少; -中英文完美切换; -汉化不受软件版本限制; -维持系统、软件运行稳定; -内建高速搜索引擎,快速字典检索; 特别: 里面还包括 ...

    vc++编写的通讯录,希望各位大侠帮我改一下,我实在是不懂!!!!!

    这个程序运行时出现问题,我找不到问题的所在,希望各位大侠多多指教,最好可以改我改好发一份给我,我的邮箱地址是nfntt@163.com

    java 面试题 总结

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    Hibernate 分页示例 SQLServer 数据库

    一个基于Hibernate 和 SQLServer 数据库的分页示例,所有文件和数据库备份都在,只是速度不怎么快,如果加上自动生成下拉框,速度就更慢了,单表、10008条测试数据,如果哪位大侠改进了查询速度望告之:vni2007@163....

Global site tag (gtag.js) - Google Analytics