如果是要求当某个员工读取订单,现在正在处理中,其他员工不要见的话,
一个建议:读完之后(未处理完),对数据库中记录设置一个已读flag

解决方案 »

  1.   

    当两个员工把数据读出来在浏览器上显示
    订单号  订单人  是否处理
    001     xxx       0
    002     yyy       0
    003     zzz       0当第一个员工把001审核之后,它无法通知第二个员工,001已经被处理了....这样很麻烦
    不知道采用哪种方式比较好...
      

  2.   

    这里不知道楼主所采用的是什么一个结构,所以并不好说。咋看象是线程问题,但是这样处理或许会带来很多问题,所以只能说我在以前的工程中遇到这样的事态,会考虑用到EJB当中的CMP来处理类似的问题
      

  3.   

    结构就是上面这样的啊。
    就象火车站售票一样,这张票卖出后,另一个人就不能再卖这个票了.但是在这张票被卖之前,有可能被多个售票员都查询出来,同时显示在屏幕上。当某个售票员正要售这张票时,这张票已经被另一个操作员售出去了...象这种问题不知道怎样处理的。CMP其实也只是一种容器,好象不能解决这样的问题吧。
      

  4.   

    客户时时向数据库中新增订单,公司有5个操作员在线对订单进行确认,怎样处理并发性问题?即001号订单如果被1号操作员处理之后,就不被其它操作员处理,其它操作员屏幕上也没有此条数据.我说一个吧:
      每一个客户端连接数据库后:
    (1) 在数据库中登记客户端自身的IP地址和接收消息的UDP端口
    (2) 当其中的一个客户端对数据表进行操作后,数据库自动执行该表的触发器
    (3) 该触发器调用系统的消息发送程序,将更新消息发送到每一个客户端
    (4) 当客户端收到刷新消息后,刷新该表的数据,更新用户界面上的数据。
    (5)本文用到的消息的传输协议是udp协议,因此在服务器上需要登记客户端接收udp消息的端口。当客户端退出后,需要注销登记的IP地址和端口。
    有点资料,随后贴出。
      

  5.   

    希望对楼主的思路有个帮助,出处忘记了,手工收集的。基于ORACLE实时C/S系统的实现
    宁波港口EDI中心 贺伟国摘  要 本文介绍了如何利用ORACLE调用外部过程的功能,开发基于ORACLE数据库的实时C/S系统。 
    关键词 ORACLE,VC,外部过程,实时系统,UDP(User Datagram Protocol)1、引言
    目前很多MIS系统是Client/Server架构,Client/Server应用系统基本运行关系体现为"请求/响应"的应答模式,每当用户需要访问服务器时就由客户机发出"请求",服务器接受"请求"并"响应",然后执行相应的服务,把执行结果送回给客户机,由它进一步处理后再提交给用户。
    在实时性要求不高的系统中,客户机只要不定时的手工刷新数据就能当前后端数据库的最新内容,但是对于实时性要求比较高的系统,如果某一个客户机更新了数据,而其它客户机没有及时更新数据,继续对未更新的数据进行操作,就会引起数据库更新错误,严重点还会产生脏数据,导致系统出错;为了解决这一问题,可以有两个方法:一是客户端设置一个定时器,定时刷新数据;另外一个方法是当表的数据更新时,服务器端发送消息通知所有客户端更新数据,客户端收到消息后更新数据。本文就后一种方法进行介绍。2、系统结构
    系统的结构如下图:
    每一个客户端连接数据库后:
    (1) 在数据库中登记客户端自身的IP地址和接收消息的UDP端口
    (2) 当其中的一个客户端对数据表进行操作后,数据库自动执行该表的触发器
    (3) 该触发器调用系统的消息发送程序,将更新消息发送到每一个客户端
    (4) 当客户端收到刷新消息后,刷新该表的数据,更新用户界面上的数据。
    (5)本文用到的消息的传输协议是udp协议,因此在服务器上需要登记客户端接收udp消息的端口。当客户端退出后,需要注销登记的IP地址和端口。
      

  6.   

    3、Oracle调用外部过程介绍
    由于oracle本身没有发送udp消息的API,因此需要利用操作系统的API进行这种操作。Oracle8i以上版本开始提供了直接调用用C语言写的动态连接库的功能,通过这一特性,可以用C写一个发送消息的动态连接库,然后在oracle的触发器中调用这个动态连接库,这样就能实现系统的要求。
    ********************************************************************
    ****为了让Oracle能够调用外部过程需要完成以下步骤:******************
    1. 用C语言对该过程编码并将它编译成一个动态连接库。
    2. 配置SQL*Net参数文件并启动监听器。
    3. 创建一个库数据字典对象以表示该操作系统库。
    4.用PL/SQL创建一个wrapper过程以将PL/SQL参数映射为C参数。
    ********************************************************************
    3.1 配置SQL*Net监听器
    监听器配置文件listener.ora文件格式:
    listener=
    (ADDERSS_LIST=
      (ADDRESS=
      (PROTOCOL=ipc)
      (KEY=<<LISTENER_KEY>>)
      )
    )
    sid_list_listener=
      (SID_LIST=
      (SID_DESC=
    (SID_NAME=<<EXTPROC_SID>>)
    (ORACLE_HOME=<<ORACLE_HOME>>)
    (PROGRAM=extproc)
    (ENVS="EXTPROC_DLLS=ANY")
              )
       
       
    )
    这个文件的关键部分是SID列表的(PROGRAM=extproc)节,这一项指明这个链接将被用来分裂extproc,而不是连接到数据库上。TNS文件tnsnames.ora格式:
    Extproc_connection_data=
      (DESCRIPTION=
        (ADDRESS=
          (PROTOCOL=ipc)
          (key=<<LISTENER_KEY>>)
         )
         (CONNECT_DATA=
           (SID=<<EXTPROC_SID>>)
         )
       )
    需要注意的是listener.ora和tnsnames.ora中SID必须相同。3.2 创建库创建库的语法如下:
    CREATE LIBRARY library_name
     {IS|AS}
    ‘operating_system_path’;
    这里library_name是新库的名字,而operating_system_path是文件系统中共享库的完整路径(包括目录)。
    例:
    create library stringlib as
    ‘c:\test\stringlib.dll’;
    此时数据库不会验证操作系统的动态连结库是否存在,只是在调用过程时才检测该库是否存在。3.3 创建Wrapper过程(变换过程)如果要调用一个外部过程,就必须创建一个Wrapper过程,该过程的作用是将PL/SQL参数映射为C参数,并且告诉PL/SQL外部库的名字。
    创建Wrapper过程的语法如下:
    CREATE   PROCEDURE   procedure_name [parameter_list]
    AS  EXTERNAL
    LIBRARY library_name
    [NAME external_name]
    [LANGUAGE language_name]
    [CALLING STANDARD |C|PASCAL|]
    [WITH CONTEXT]
    [PARAMETERS  (external_parameter_list)];假设已经建了一个库stringlib,该库调用系统的stringlib.dll,动态连接库中有个函数OutputString(char * path,char *message),则可以用如下代码创建一个wrapper过程:create procedure outputstring(
      p_path in varchar2,
      p_message in varchar2)as external
    library stringlib
    name “OutputString”
    parameters(p_path string,
             p_message string);这样一个wrapper过程就创建好了,在oracle中就可以调用此过程了。
      

  7.   

    推荐到www.ojava.net,里面的资料下载有一本java多线程的书