如何做一个最完美的实时数据传输程序

实时数据传输程序
本文探讨了如何构建高效的实时数据传输程序。作者最初的想法是使用AJAX频繁查询数据库获取最新信息,但考虑到性能问题,同事建议采用触发器机制来减少不必要的数据库访问。文中还分享了一种具体的实现方案。

如何做一个最完美的实时数据传输程序

年底公司没什么事,看到同事们都在刷各个不同的二手火车票网站,因为要得到最新信息要不停的F5,所以我想做一个实时更新最新数据的web程序,反正也没什么事情做。
我的思路是:利用ajax每秒访问数据库一次,如果有最新的数据就返回最新数据,完成小demo,功能也实现了,但是同事觉得我的思路不好,因为不停的访问数据库会影响效率,公司是做税务的,效率总是放在第一位的。
同事也提供了一个思路,利用ajax每秒访问后台但是不允许数据库,利用oracle的触发器,如果有新数据插入就允许访问相关数据库数据。
不知道能否用触发器控制一段java代码,这个暂且不说,就算可以实现效率会提高多少?
不知道大家是否有什么看法和新的思路,怎么样才能做一个最完美的实时数据传输程序。

我的实现思路如下:

实现通过DWR Reverse Ajax调用EXTJS的Observable Class(Java CODE)

Collection<ScriptSession> sessions = serverContext.getScriptSessionsByPage(pageUrl);
logger.debug("the page:{} url's session size is {}", pageUrl,sessions.size());
ScriptBuffer script = new ScriptBuffer();
script.appendScript("cti.fireVoiceEvent(")
.appendData(event)
.appendScript(");");
logger.debug("the script is {}", script);
for(ScriptSession session:sessions){
logger.warn("session id is {}", session.getId());
session.addScript(script);
}

cti.js如下:

Ext.namespace('cti');
cti.Voice = function(){
this.addEvents({
"dialing" : true,
"ringing" : true,
"established" : true,
"released" : true
});



};
Ext.extend(cti.Voice, Ext.util.Observable);
cti.VoiceCallBack = new cti.Voice();
cti.fireVoiceEvent = function(event){
var runFireEvent = cti.VoiceCallBack.fireEvent.bind(cti.VoiceCallBack);
runFireEvent(event.name,event);
}

然后在Voice.js处理,各种Event事件如下:

Ext.onReady(function(){



var targetDN = Ext.get('targetDN');
var thisDN = Ext.get('thisDN');
var connId = Ext.get('connId');

//make call
var makeCallButton = Ext.get('makeCallButton');
var onMakeCall = function() {
cti_voiceService.makeCall(thisDN.getValue(),targetDN.getValue());
};

makeCallButton.on('click',onMakeCall);

//answer call
var answerButton = Ext.get('answerButton');
var onAnswer = function() {
cti_voiceService.answer(thisDN.getValue(),connId.getValue());
};

answerButton.on('click',onAnswer);

//release call
var releaseButton = Ext.get('releaseButton');
var onRelease = function() {
cti_voiceService.release(thisDN.getValue(),connId.getValue());
};

releaseButton.on('click',onRelease);

//logout
var logoutButton = Ext.get('logoutButton');
var onLogout = function() {
cti_voiceService.release(thisDN.getValue(),connId.getValue());
cti_voiceService.logout(thisDN.getValue());
};

logoutButton.on('click',onLogout);

Ext.EventManager.on(window, 'unload', function() {
cti_voiceService.release(thisDN.getValue(),connId.getValue());
cti_voiceService.logout(thisDN.getValue());
});


//onRinging Event Handler

var onRinging = function(ev){

cti.onStateChange(ev);

document.voice.connId.value = ev.connID;
document.voice.thisDN.value = ev.thisDN;
document.voice.answerButton.disabled = false;
document.voice.releaseButton.disabled = true;
};

cti.VoiceCallBack.on('ringing',onRinging);

//onDialing Event Handler
var onDialing = function(ev){
cti.onStateChange(ev);
document.voice.connId.value = ev.connID;
document.voice.answerButton.disabled = true;
document.voice.releaseButton.disabled = true;
};

cti.VoiceCallBack.on('dialing',onDialing);

var onEstablished = function(ev){
cti.onStateChange(ev);
document.voice.connId.value = ev.connID;
document.voice.answerButton.disabled = true;
document.voice.releaseButton.disabled = false;
};

cti.VoiceCallBack.on('established',onEstablished);

var onReleased = function(ev){
cti.onStateChange(ev);
document.voice.connId.value = ev.connID;
document.voice.thisDN.value = ev.thisDN;
document.voice.answerButton.disabled = true;
document.voice.releaseButton.disabled = true;
};

cti.VoiceCallBack.on('released',onReleased);


cti.reverseAjax();




})

这只是其中一种实现方式而已。Reverse ajax还可以通过NIO Socket向IE/FF的Applet Socket Client发送JSon Event,由Applet执行当前页面的fireEvent。

可以通过Spring,配置不同的Reverse ajax实现方式。如果有什么不理解的,请随时找我。 rasonyang@hotmail.com

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值