吵吵   2017-11-26  阅读:2,095

缘起于近来东华的LIS系统总是莫名奇妙的报错,程序放在那里一段时间不用的话,正常情况下会跳出一个锁频的界面,但是最近的系统很奇怪,锁频输入账号密码的界面没有了,弹出一个Choose Server Connection出来!

于是乎得解决一下这个问题。

第一步,怀疑是工作站的问题,弹出锁频窗口是用timer控件进行控制的,而且与数据的连接采用另外一个vism.ocx,等于是用另外一个进程运行了vism.ocx,那么问题是不是就出现在这里了?

改了改代码还是不行。

突然想到为啥其它工作站不报的?考虑到以前刚刚看完的vism.ocx控件的同步机制,莫非是多开?

打开任务管理器一看,靠六七个进程在哪里卡死了,因此,新的vism控件再次去连接服务器的时候,就出现连接被重置的情况!

估计是因为系统卡在后台了,结果工作人员就不停的多开,导致启动了N个程序。

因而,解决的办法是在启动前把以前的进程Kill掉。

解决这个问题后,我们再思考,vism到底可不可以用多个呢?

先说vism控件的几个特点:

1、单线程同步机制。同步机制意味着你得等它跑完了,才执行下一句代码,没有回调机制。为什么这个玩意要这么设计,因为这个玩意又叫直接连接模式,速度快,文档里面叫Using Caché Direct

2、控件需要窗口容器,意味着直接在单线程中跑不了。

3、vism的连接机制,通过CDConnect连接服务器,如下图

CDConnect,也就是连接句柄是本地生成的,也是说本地的多个vism控件得排队来用CDConnect,一个CDConnet对应服务器处理的一个进程,也对应一个channel。

理解了这个,我们又要问一个问题了,什么情况下多个vism才对应一个CDConnet句柄呢?

上面这张图就告诉你了什么时候会新建一个CDConnect,什么时候会连接到同一个CDConnect,而右边就对应vism连接调用的函数或者方法。

但是好像还是并不够,我还是不知道多个程序都用vism会公用一个vism还是多个?

那就写代码测试吧,放多个vism,用多个连接函数,然后网页打开management portal,进入process里面跟踪服务器进程,看看进程ID以及产生的数量。经过测试得出以下结果:

1、本地开多个进程,即启动多个程序的话,哪怕程序名称都一样,连接服务器的IP都一样,还是会连接多个CDConnect,在服务器端也是多个数据库进程。

2、本地开一个程序,使用多个vism控件的话,如果使用vism.Server=”xxx”的话就是多个vism控件都共用一个CDConnect,服务器也只有一个进程。

3、一个程序多个vism控件,如果使用vism.Server=”xxx”连接,不仅用一个CDConnect,而且会change channel,即服务器的processID号变化了,把原来的进程杀掉了,新建了另外一个进程。

4、一个程序用多个vism控件,而且为了避免一个卡死另外不能用的话,建议还是用vism.connect(string) 建立一个新的CDConnect,在服务器上也就多了一个处理的线程。

至于服务器是如何干掉不用的process的话,这个要等待继续研究!

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

一条回应:“Cache数据库之多个vism控件应用问题”

  1. 净水器厂家说道:

    看了文章才知道,来学习一下了

发表评论

电子邮件地址不会被公开。 必填项已用*标注