通常的三层架构,数据库,数据访问层,界面层。通讯技术定义了三层组件之间的调用约定,以及方法。这样说起来有些抽象,举例为证。现在要制作一个进销存项目,基本的功能是进仓,出仓,转仓,查询功能要能查询到仓库进出日记帐,
库存余额。对于一笔物料为FLEX0901的进仓业务,用ORM的方式完成,伪代码如下
InventoryMovmentEntity receipt=new InventoryMovmentEntity(“REF1108080001”,"RECEIPT”);
InventoryMovmentDetailEntity detail=receipt.InventoryMovmentDetails.AddNew();
detail.ItemNo=”FLEX0901”;
detail.MoveDate=DateTime.Now;
InventoryMovementDAL.Instance.Save(receipt);
这里有几个问题处理的不错,比如
1) ORM的数据读写,关注面从拼凑SQL读写到构建实体,这是进步。如果用DAL+SQL Script的方式完成,伪码如下
string mySql=”INSERT ICMOVH(RefNo,Direction) VALUES(‘REF1108080001’, 'RECEIPT’) ";
InventoryMovementDAL.Instance.ExecuteNonQuery(mySql);
mySql=”INSERT ICMOVD(ItemNo,MoveDate) VALUES(‘FLEX0901’,'2011/8/8’) ";
InventoryMovementDAL.Instance.ExecuteNonQuery(mySql);
这里省略了拼凑参数值的句段,直接把值放到SQL语句中去。
后一种方式,明显的缺陷时,当添加新的字段,对系统扩展时,修改和维护起来的成本,明显大于前者。
2) 使用了单件模式,InventoryMovementDAL.Instance来统一操作数据读写,而不是这样
InventoryMovementDAL inventoryDAL=new InventoryMovementDAL();
inventoryDAL.Save(receipt);
从这个单件模式,引出了通讯技术的必要性。当有很多个用户,同时操作进仓功能,意味着同时有很多个InventoryMovementDAL的数据写入操作,这时产生的问题
1)不好控制前后两张单据的进仓单参考编号重复。为保证不重复,在保存之前,我们需要到数据库检查一次是否已经存在该参考编号的进仓单,也就是InventoryMovementDAL的Save方法的开头,
要包含这样一段代码,以DAL+SQL Script的方式表示
string mySql=” SELECT COUNT(1) FROM ICMOVH WHERE RefNo=’REF1108080001’ ";
bool existing=InventoryMovementDAL.Instance.ExecuteScalar(mySql)>0;
可以想像,当并发用户为100时,每一笔进仓业务,需要预先一次数据检查,来回于数据库,这样的程序性能肯定不好。
2 )对于库存报表,多个并发的InventoryMovementDAL会导致数据前后不统一。库存余额报表现在可以读到物料FLEX0901还有100个pc,一会当有进仓单入库200pc的FLEX0901时,如果不手动刷新数据,此时的报表仍然显示的物料FLEX0901的库存余额是100,而不是300. 这有时候是不可接受的结果。
可以做一个timer,定期刷新库存余额。这里的问题是,InventoryMovementDAL只有一个实例,无法自己告诉自己,已经有新的库存了,重新读取数据。这里需要一种并发机制,告诉InventoryMovementDAL实例,有新的数据加入到库存余额中,需要刷新报表。
3)有一些数据项,是全局的,对于整个系统都是唯一的,需要特殊处理。
比如ERP系统允许的并发用户,同时允许有10个用户连接进入系统,超过则无法处理;
ERP系统的一个用户把当前系统的默认货币从HK$改进了US$,其它的用户,要能知道这个改变,此时,不太可能让当前正在操作业务的用户退出,重新进入系统;
当发生网络故障时,ERP系统要能知道网络故障,并suspend当前正在进行的操作;这一点可以理解为一条有效的改善,当无法连接到SQL Server时,要阻止当前正在录入数据的用户,否则他很辛苦的录入了数据,而系统又无法保存,给出一个提示A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections 用户会抱怨你的软件没有做好,尽管这不是你的错。
如下图,当前用户正在编辑客户资料,发生网络故障,界面被Disable了。借助于通讯技术中的并发,可以实现。
当你的程序遇到这几个问题时,是否可以考虑下通讯技术,来改善性能和客户体验。
s