`
F.B.I
  • 浏览: 8289 次
  • 性别: Icon_minigender_1
  • 来自: 基地
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java如何做到实时-----两种方案

阅读更多
今天老大提出这样的需求:"数据库新增了数据就要及时通知应用层做一系列的处理"

针对这需求我觉得应该分为两种方案: 如有更好的欢迎大家指教

第一:
      SQL+存储过程+触发器+DLL调用的方法来实现数据实时

第二:
     后台弄一个线程做定时查询(例如1秒钟2次查询),但这里就涉及到性能的问题,对于庞大的数据量我觉得有个方案
     做个临时表
      比如A表是原来的数据库表 那么把一个小时(时间自定)内的数据放到临时B表里,每隔1小时清空B表里的数据,要数据就索引B表里的数据,然后再做相应的处理
    
分享到:
评论
29 楼 lixjluck 2009-11-11  
实时,我觉得有点偷换概念,这个一般用在生产领域

其实这里要做的就是数据同步,那么楼上已经有很多解决方案了
用jms是一个比较好的方案,可以解决集群、或单机宕机问题
28 楼 andy54321 2009-11-11  
jjxlcsw 写道
可能是直接通过数据库的工具更新数据的。 根本就不走jdbc

这个就用线程扫描了(可以使用中间表或试图提取数据),
感觉触发器比这个要低效点
27 楼 langyu 2009-11-11  
数据库新增加数据总是有程序往里面塞的吧
塞数据的程序在添加数据后,就通知一个监听程序,让监听程序去数据库中去取
(可以传一个新添数据的最小Id给监听程序,让它从这个id之后取最新数据)
26 楼 F.B.I 2009-11-11  
<div class="quote_title">ubotutwin 写道</div><div class="quote_div"><p> </p>
<div class="quote_title">rovanz 写道</div>
<div class="quote_div">....<br>只要统一数据库操作的入口不就做到了,你爱杂折腾咋折腾,而且这种方式对数据库没有任何额外的操作</div>
<p>    这种方法最好,但需要架构设计师有很丰富的经验,在设计时就考虑到。否则项目成型再改,改动量巨大。</p>
<p> </p>
<div class="quote_title">lovemylover 写道</div>
<div class="quote_div">从数据源入手,使用代理模式封装数据源,在其中解析sql命令,如果是涉及指定表的变更操作(如insert、delete、update)等,调用相关应用程序。</div>
<p>    这种方法有一个小问题,就是如果高级语言这边调用成功了,而db处理失败了,那也会“调用相关应用程序”,其他就和上面的一样了。</p>
<p> </p>
<p>     lz说的直接用触发器,这个又有点性能问题。</p>
<p> </p>
<p>     我建议的做法,搞个中间表,插入时统一插入这个中间表,定时(或按其他规则也行)从中间表插数据到原表。</p>
<p> </p>
<p>     这样做的好处有二:</p>
<p>         1、只要扫描中间表就知道有没有insert数据,而如果设置转储时间间隔(就是移数据到原表的间隔)较小的话,中间表肯定比原表小很多,性能影响小。</p>
<p>         2、这样搞虽说也要改代码,但比较好改。可以想象,如果直接把原表当中间表来用,然后建个新表放原表的数据,这样java端什么代码都不用改。或者把原表的表名全部替换成中间表的表名,其他工作对java(或其他语言)端是透明的。而转储工作可以写个简单的过程由db来做,程序员根本不用考虑这些问题。</p>
<p> </p></div><br/>其实触发器有弊端的,有时候触发器 不触发 不知道你们是否遇到过

你说的两点好处 ,我也是这么跟老大说的 ,老大说这个数据库都是弄好的,不能动,这个也不是我来做,只是他要我想办法,我就说出我的观点,你的这种方法不就是我的第二种方法吗?扫描中间临时表
25 楼 ubotutwin 2009-11-11  
<p> </p>
<div class="quote_title">rovanz 写道</div>
<div class="quote_div">....<br>只要统一数据库操作的入口不就做到了,你爱杂折腾咋折腾,而且这种方式对数据库没有任何额外的操作</div>
<p>    这种方法最好,但需要架构设计师有很丰富的经验,在设计时就考虑到。否则项目成型再改,改动量巨大。</p>
<p> </p>
<div class="quote_title">lovemylover 写道</div>
<div class="quote_div">从数据源入手,使用代理模式封装数据源,在其中解析sql命令,如果是涉及指定表的变更操作(如insert、delete、update)等,调用相关应用程序。</div>
<p>    这种方法有一个小问题,就是如果高级语言这边调用成功了,而db处理失败了,那也会“调用相关应用程序”,其他就和上面的一样了。</p>
<p> </p>
<p>     lz说的直接用触发器,这个又有点性能问题。</p>
<p> </p>
<p>     我建议的做法,搞个中间表,插入时统一插入这个中间表,定时(或按其他规则也行)从中间表插数据到原表。</p>
<p> </p>
<p>     这样做的好处有二:</p>
<p>         1、只要扫描中间表就知道有没有insert数据,而如果设置转储时间间隔(就是移数据到原表的间隔)较小的话,中间表肯定比原表小很多,性能影响小。</p>
<p>         2、这样搞虽说也要改代码,但比较好改。可以想象,如果直接把原表当中间表来用,然后建个新表放原表的数据,这样java端什么代码都不用改。或者把原表的表名全部替换成中间表的表名,其他工作对java(或其他语言)端是透明的。而转储工作可以写个简单的过程由db来做,程序员根本不用考虑这些问题。</p>
<p> </p>
24 楼 qianlei007 2009-11-11  
sunnymoon 写道
“数据库新增了数据就要及时通知应用层做一系列的处理”
功能需求不能于技术实现方案。显然你把需求当成技术实现了。


需求不用代码,用什么实现? 没明白意思!
23 楼 sunnymoon 2009-11-11  
“数据库新增了数据就要及时通知应用层做一系列的处理”
功能需求不能于技术实现方案。显然你把需求当成技术实现了。
22 楼 F.B.I 2009-11-11  
SQL2000+存储过程+触发器+DLL调用的方法来实现数据实时转换
在GPS/GIS系统中经常会遇到坐标系问题,一般GPS模块输出的位置数据是参考84坐标的,而在系统应用的时候,特别在政府应用系统中的GIS电子地图常常采用地方坐标系。为了能够正确地在电子地图上显示移动终端的位置,需要将位置数据从84坐标转换到地方坐标。在实时环境下,如何自动完成转换,这里采用了SQL2000+存储过程+触发器+DLL调用的方法来实现。
1)背景
环境:windows2000+sp4
数据库:SQL2000
动态库制作:VB
结构:C/S
2)工作思路
采用TCP/IP将移动终端的位置数据传递到服务器,存入数据库的实时数据表a中;
在该实时数据表a上创建触发器(FOR INSERT),每当实时数据表a中记录插入的时候,触发器被激活,执行存储过程datatrans,该存储过程自动初始化COM实例,调用DLL中的转换方法,实现位置数据的坐标转换,将转换后的数据插入新的实时数据表b。
3)主要函数
SQL Server中的7个用于COM操作的扩展存储过程。
当需要操作一个COM对象时,首先通过调用sp_OACreate建立一个COM对象的实例,然后通过一系列的sp_OAGetProperty、sp_OASetProperty和sp_OAMethod调用完成需要完成的任务,在完成对COM对象的操作后,还需要调用sp_OADestroy释放该对象。每个调用返回一个整数类型的HRESULT,如果调用成功则该值为0。7个存储过程分别是:sp_OACreate 建立自动操作对象的一个实例
sp_OADestroy 释放一个对象的实例
sp_OAGetErrorInfo 从其他过程返回的HRESULT中获得错误描述信息
sp_OAGetProperty  把一个对象的属性存储在结果集或局部变量中
sp_OASetProperty  改变一个对象属性的值
sp_OAMethod 执行对象的方法,向方法传递参数,并得到返回值
sp_OAStop 关闭SQL Server的自动操作环境  
4)代码
a)VB实现的DLL
打开VB6.0的IDE,按照ActivX DLL模版新建工程gpsSQLCOM,
CLASS的名称GPSFunction,工程名称gpsSQLCOM
实现转换
Public Function GetGpsDataSH(process_tmpGpsData As String) As String
‘输入process_tmpGpsData为84坐标数据
‘输出GetGpsDataSH=为地方坐标数据
END Fnction
编译输出DLL
b) 存储过程datatrans的实现
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[gps_datatrans]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[gps_datatrans]
GO

CREATE PROCEDURE gps_datatrans
@gpsvid varchar(25),
@gpsdata varchar(50)
AS
--定义用到的变量
declare @obj int,@re int
declare @VehileIDstring varchar(30)
declare @Mobilerestring varchar(30)
declare @Gpsadatastring varchar(30)
declare @sqlTable varchar(30)
declare @insertstring nvarchar(1000)

SET NOCOUNT ON
set @sqlTable='b'

--创建调用实例
exec @err=sp_OACreate 'gpsSQLCOM.GPSFunction', @obj out
if @err<>0 goto lberr --如果创建失败,则进行错误处理

--调用DLL中的位置转换函数
exec @err=sp_OAMethod @obj,'GetGpsDataSH',@Gpsadatastring out,@gpsdata
if @err<>0 goto lberr --如果调用错误,则进行错误处理
print '返回的结果是:' + @Gpsadatastring

--将结果存入数据表b,采用sp_executesql可以动态产成sql语句
set @insertstring=' INSERT INTO @sqlTabl (VEHICLEID,Time , DATA)
       VALUES( @VehileIDstring,@Datetimestring,@Gpsadatastring )'
exec sp_executesql @insertstring,N'@VehileIDstring varchar(30),
@Gpsadatastring varchar(50) ,
@sqlTabl ',
                @gpsvid,,@Gpsadatastring, @sqlTabl
--完成后释放实例
exec sp_OADestroy @obj
return

lberr:
--错误处理
c)触发器实现
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[gps_insert]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
drop trigger [dbo].[gps_insert]
GO

CREATE TRIGGER gps_Insert
ON [a]
FOR INSERT
AS
BEGIN

declare @gpsvid varchar(50)
declare @gpsdate varchar(50)

SET NOCOUNT ON
--获得新插入数据
select @gpsmobile =[feild1],
       @gpsvid=[ feild2],
       @gpsdata=[ feild3]

FROM a AS P INNER JOIN Inserted AS I
ON P. feild1 = I. feild1
--执行转换存储过程
exec gps_datatrans @gpsvid, @gpsdata

END
5)小节
采用这样的方式,以数据库为中心,转换灵活,只要制作不同的转换函数,就可以灵活实现多种坐标各式的转换,而通过触发器激活,不必使用专门的进程不停的来轮讯来发现新纪录,系统负担低。而且利于不同的前置系统接入也非常容易。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/black_ben/archive/2006/02/16/593854.aspx
21 楼 F.B.I 2009-11-11  
yuanyi_wang 写道
可以在触发器里插入一个message到AQ(Oracle内置的queue服务,在oracle中有个package可以直接操作),再用JMS接受这个消息。


为什么潜意识里认定是oracle?我们所要做到的是与数据库无太大的关系。不管是oracle还是mysql 或者sqlserver都能ok
20 楼 viei 2009-11-11  
两种方法
1:临时表然后一个守护进程不停扫表,然后进行任务分发处理
2:所有对关系改变的数据操作前加一个中间层,就是在数据操作的时候写消息然后用jms异步进行处理。用jms来保存和分发任务可以用开源的activemq

现在你看到的很多webgame都是用着两种办法来做建筑升级之类的操作的和你的类似
19 楼 wl95421 2009-11-11  
不用修改JDBC,也不一定要用AOP
可以参考一下P6Spy的做法
不过这种方案比较合适于单机

如果集群或者异构系统,那么用MemCache+JMS可能会比较合适一些。
18 楼 weishuang 2009-11-11  
Oracle提供的DCN(Data Change Notification)服务
17 楼 luckaway 2009-11-11  
rovanz 写道
....
只要统一数据库操作的入口不就做到了,你爱杂折腾咋折腾,而且这种方式对数据库没有任何额外的操作

这个是常规的做法!!!
16 楼 yuanyi_wang 2009-11-11  
可以在触发器里插入一个message到AQ(Oracle内置的queue服务,在oracle中有个package可以直接操作),再用JMS接受这个消息。
15 楼 jjxlcsw 2009-11-11  
可能是直接通过数据库的工具更新数据的。 根本就不走jdbc
14 楼 F.B.I 2009-11-11  
mathfox 写道
rovanz 写道
....
只要统一数据库操作的入口不就做到了,你爱杂折腾咋折腾,而且这种方式对数据库没有任何额外的操作


修改JDBC driver怎么样?

不知道这么做合不合理

修改jdbc driver?
13 楼 mathfox 2009-11-11  
rovanz 写道
....
只要统一数据库操作的入口不就做到了,你爱杂折腾咋折腾,而且这种方式对数据库没有任何额外的操作


修改JDBC driver怎么样?

不知道这么做合不合理
12 楼 boltwu 2009-11-11  
是否可以用AOP来实现呢,在新增,修改,删除之后做一些操作
11 楼 condeywadl 2009-11-10  
设定一个更新版本号 每次更新之后都重新设置下那个版本号 应用层定时访问这个版本号 如果变了 就重新读取数据库 LZ认为这个方案如何
10 楼 gaodendaishu 2009-11-10  
rovanz 写道
....
只要统一数据库操作的入口不就做到了,你爱杂折腾咋折腾,而且这种方式对数据库没有任何额外的操作

这个比较好啊

相关推荐

    cors-filter-2.5 + java-property-utils-1.9.1.zip

    在这个"cors-filter-2.5 + java-property-utils-1.9.1.zip"压缩包中,主要包含了两个关键组件:CORS Filter和Java Property Utils。 1. CORS Filter: CORS Filter是处理跨域请求的一种解决方案,它作为一个...

    Tomcat解决跨域的两个jar包java-property-utils-1.9.jar和cors-filter-1.7.jar

    本篇将详细介绍如何利用java-property-utils-1.9.jar和cors-filter-1.7.jar这两个jar包解决Tomcat的跨域问题。 首先,让我们了解`java-property-utils-1.9.jar`。这个库是由Apache Commons项目提供的,主要用来处理...

    cors-filter-1.7.jar和java-property-utils-1.9.jar

    标题中的“cors-filter-1.7.jar”和“java-property-utils-1.9.jar”是两个Java库的JAR文件,它们在Java开发中扮演着重要角色,特别是对于Web应用程序。这里,我们将深入探讨这两个库的功能和它们在“jasperserver”...

    java猜数字-两种游戏模式.rar

    【标题】"java猜数字-两种游戏模式.rar"是一个基于Java Swing开发的桌面应用程序,它实现了猜数字游戏,且提供两种不同的游戏模式。这个压缩包包含游戏的源代码以及一个程序设计开发文档。 【描述】中提到的关键...

    javabase64-1.3.1.jar

    JavaBase64-1.3.1.jar 是一个专门用于...总的来说,JavaBase64-1.3.1.jar是一个实用的Java库,它为开发者提供了一种简单、高效的Base64编码和解码解决方案,特别适用于那些需要在不同平台之间交换二进制数据的项目。

    syslog-java-client-1.0.1.zip

    syslog-java-client可能支持其中一种或两种,需要根据需求选择合适的配置。同时,由于syslog协议不保证消息的可靠传输,开发者可能需要结合业务场景,决定是否采用TCP或SSL/TLS等更可靠的传输方式。 总的来说,...

    aws-java-sdk

    3. **异步和同步API**:SDK提供了同步和异步两种调用模式,开发者可以根据应用场景选择合适的方式处理请求,以优化性能和响应时间。 4. **身份和访问管理(IAM)**:SDK支持IAM,可以方便地管理用户的权限,确保...

    java-unrar-0.3.jar以及commons-logging-1.1.1.jar

    Java-unrar-0.3.jar 和 Commons-Logging-1.1.1.jar 是两个在Java开发中常用的库,主要用于处理RAR文件的解压缩和日志记录。以下将详细阐述这两个库的功能、使用方法以及它们在Java开发中的重要性。 1. Java-unrar-...

    aws-java-sdk-kinesis-1.10.18.zip

    总之,"aws-java-sdk-kinesis-1.10.18.zip"和"raml-java-parser.zip"代表了两个不同的领域:一个是实时流数据处理,另一个是RESTful API的设计和文档化。这两个项目都是开源的,允许开发者根据自己的需求进行定制和...

    luajava-1.1-x64-lua51

    在IT领域,尤其是在游戏开发和脚本编程中,Lua和Java两种语言常常被结合使用,以发挥各自的优势。"luajava-1.1-x64-lua51"是一个针对64位系统的版本,它提供了将Lua脚本集成到Java应用中的解决方案。本文将深入探讨...

    topsis.zip_java topsis_java---topsis_java-topsis_topsis_topsis n

    TOPSIS是一种多属性决策分析方法,常用于在多个备选方案中选择最优解,它基于理想解和反理想解的概念,通过计算每个方案与理想解和反理想解的距离来评估和排序。 【描述】"Topsis using java this can use Netbeans...

    Java-Interview-超全集合github上评分最高的jiva面试题

    - **内存泄漏与内存溢出**:如何检测和避免这两种问题。 5. **设计模式** - **常见设计模式**:单例、工厂、观察者、装饰器、代理、适配器等23种设计模式的应用场景和实现方式。 6. **Git基础** - **版本控制**...

    nexus-3.69.0-02-java17-unix.tar.gz

    用户需先使用`tar -zxvf nexus-3.69.0-02-java17-unix.tar.gz`命令进行解压,解压后会得到两个主要文件夹:“sonatype-work”和“nexus-3.69.0-02”。 “sonatype-work”文件夹包含了Nexus运行时的数据,如存储库的...

    java-client5.0.4和selenium-java-3 jar包

    结合这两个库,你可以构建一套全面的跨平台自动化测试解决方案。例如,你可以先使用Selenium WebDriver进行Web应用测试,然后利用Appium Java客户端进行移动应用的测试。这使得开发者可以在多个平台上验证应用程序的...

    taobao-sdk-java-auto.zip

    总之,"taobao-sdk-java-auto.zip"是一个针对Java开发者的实用工具,它简化了与淘宝和钉钉接口的对接,为开发企业级应用提供了便捷的登录解决方案。开发者只需按照文档说明正确配置和使用,就能将强大的钉钉扫码登录...

    mariadb-java-client-1.4.4 and sources

    MariaDB Java 客户端是用于与MariaDB数据库进行交互的一种Java API,它提供了JDBC驱动程序,使得Java开发者能够方便地在Java应用程序中执行SQL查询和管理数据库事务。在这个压缩包中,我们有两个文件:`mariadb-java...

    google-java-format最新

    "google-java-format"就是这样一个强大的工具,支持命令行接口(CLI)和API两种使用方式,方便开发者根据自身需求进行集成。 通过命令行调用,开发者可以在终端中运行特定命令对Java源代码进行格式化。例如,可以...

    JavaMelody javamelody-core-1.52.0.jar jrobin-1.5.9.jar

    总之,`javamelody-core-1.52.0.jar`和`jrobin-1.5.9.jar`是JavaMelody监控解决方案的重要组成部分,它们共同为Java Web应用提供了详尽的性能监控和数据分析能力。通过集成这两个JAR,开发者可以轻松地对应用进行...

    计算机科学与技术毕业论文文献翻译-R-Java和Object-C之间桥连接方法.doc

    为了让R用户能够与Java和Object-C进行通信, article 提出了两种方法:从R中开启一个JVM环境、从Java应用程序中嵌入R。 在R中使用Java功能需要通过设置环境和加载rJava包来实现。rJava包提供了一个快速的低水平的...

Global site tag (gtag.js) - Google Analytics