如果是要求当某个员工读取订单,现在正在处理中,其他员工不要见的话,
一个建议:读完之后(未处理完),对数据库中记录设置一个已读flag
一个建议:读完之后(未处理完),对数据库中记录设置一个已读flag
解决方案 »
- 用java编一个自动修改mac的程序
- 使用jstl标签奇怪错误The XMLtag syntax is: <tag attr1='value1'>
- java写数据库备份模块
- 初学者求教:关系VO设计时的问题,只存编号还是名称也存?
- Java新手问题:如何用jdk工具生成EXE文件,烦请各位高手支招^_^
- 水晶报表的打印
- 无刷新显示网站当前在线人数的代码
- java实现大文件的上传
- 如何简单取得XML的element的值,请相助
- SpringSecurity安全配置(在线等急!!!!!)
- struts+spring以及struts+ejb的问题
- 一个莫名其妙的问题:连接orcale数据库 ResultSet.getBlob()方法出错!!!!
订单号 订单人 是否处理
001 xxx 0
002 yyy 0
003 zzz 0当第一个员工把001审核之后,它无法通知第二个员工,001已经被处理了....这样很麻烦
不知道采用哪种方式比较好...
就象火车站售票一样,这张票卖出后,另一个人就不能再卖这个票了.但是在这张票被卖之前,有可能被多个售票员都查询出来,同时显示在屏幕上。当某个售票员正要售这张票时,这张票已经被另一个操作员售出去了...象这种问题不知道怎样处理的。CMP其实也只是一种容器,好象不能解决这样的问题吧。
每一个客户端连接数据库后:
(1) 在数据库中登记客户端自身的IP地址和接收消息的UDP端口
(2) 当其中的一个客户端对数据表进行操作后,数据库自动执行该表的触发器
(3) 该触发器调用系统的消息发送程序,将更新消息发送到每一个客户端
(4) 当客户端收到刷新消息后,刷新该表的数据,更新用户界面上的数据。
(5)本文用到的消息的传输协议是udp协议,因此在服务器上需要登记客户端接收udp消息的端口。当客户端退出后,需要注销登记的IP地址和端口。
有点资料,随后贴出。
宁波港口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地址和端口。
由于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中就可以调用此过程了。