北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 12903|回复: 24

MUSH+Access碰到的问题,求教

[复制链接]
发表于 2011-1-26 18:35:24 | 显示全部楼层 |阅读模式
我用的Access数据库,打开mush刚开始用的时候挺好,运行久了就会变慢,最后出错误信息:[Microsoft][ODBC Microsoft Access 驱动程序] 客户端的工作过多。我baidu了下这种情况可能是打开连接没关闭,我又仔细检查了一遍代码,每一个数据库连接我都con close了的呀...不知道会是什么原因造成这种情况呢?请指教,多谢。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-27 00:09:30 | 显示全部楼层
用了mush,请考虑sqlite。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-1-27 02:05:23 | 显示全部楼层
楼上的哥,能不能留个q我加下?教教我怎么用sqlite,只用教些基本的东东就行了,具体的俺自己摸索。Access我看不怎么靠谱,我数据库还没多大呢就开始出现莫名其妙的问题,今儿试了下MySQL发现貌似不支持中文gb2312编码?那搞个蛋蛋哦...
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-27 07:41:42 | 显示全部楼层
mysql支持gb2312的.可能是你建库的时候没有把内码问题考虑进去.

lua + sqlite好象本论坛就有谁写过一点连接代码啥的,印象中有.
好象是ddid或者hba干的?
如要使用sqlite,请升级到最新版的mush,之前的版本都没有解决内码问题
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-27 08:46:31 | 显示全部楼层
发代码看看
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-27 09:44:37 | 显示全部楼层
原帖由 inspector 于 2011-1-26 06:35 PM 发表
我用的Access数据库,打开mush刚开始用的时候挺好,运行久了就会变慢,最后出错误信息:[Microsoft][ODBC Microsoft Access 驱动程序] 客户端的工作过多。我baidu了下这种情况可能是打开连接没关闭,我又仔细检查了一 ...

没看到代码不好评论
不知道你是用odbc还是ado连接的
觉得要是用access还是 mush+vbscript 比较方便
不过access速度还是比较慢,优点是修改起来比较方便
一般都是一个connection 对象
然后多个command对象使用这个conn对象
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-1-27 16:31:17 | 显示全部楼层
writepath_room = function (area,zone,room,path_go,path_back,id_extra,id_plus)  --把记录的特定房间路径写入数据库path3_room
assert  (package.loadlib (GetInfo(56).."odbc.dll","luaopen_luasqlodbc")) ()
env = assert (luasql.odbc())
con = assert (env:connect ("Pkuxkx-Scyllane","",""))
local str = "INSERT INTO [path3_room]([area],[zone],[room],[path_go],[path_back],[id_extra],[id_plus]) VALUES('"..area.."','"..zone.."','"..room.."','"..path_go.."','"..path_back.."','"..id_extra.."','"..id_plus.."')"
cur = assert (con:execute (str))
--cur:close()
con:close()
env:close()
Note("    此记录已写入数据库path3_room。")
Execute(GetVariable("path_make_temp_back_plus").."(ok)")
end

上面是我脚本里面的一段代码,其他还有几个函数查询和写入ACCESS的跟这个差不多类似。以前用的时候一直没出现什么客户端工作过多的问题,昨天在公司和家里电脑上先后出现那毛病,想半天也没想明白到底是什么导致的……请各位大侠帮忙看看,拜谢!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-1-28 22:53:38 | 显示全部楼层
自己瞎摸索找到了症结,说一下以防有同学再碰到相似的问题。
问题貌似出在,在一个函数里连接到数据库之后,关闭该连接之前,又在另一个函数里连接到了数据库,导致关闭连接没有被执行。
比如说是有这么个函数
A = function()
连接到数据库
if 查找到某数据 then Simulate("找到") end
关闭数据库连接
end
另一个函数是
B = function()
连接到数据库
执行某操作
关闭数据库连接
end

执行A函数成功找到某数据,就会模拟一条MUD信息“找到”,如果用“找到”做trigger来执行函数B,那在函数A里,Simulate在前,关闭数据库连接在后,而Simulate又导致函数B被执行,如果B包含了连接数据库的内容,也就干扰到了A函数来关闭数据库连接的语句,因为A和B连接的是同一个数据库。

而这样不断累积打开的连接没关闭,没多久就会运算越来越慢,最后就会出现客户端工作过多的报错。

要确认自己的代码有没有不知不觉的打开了数据库没关,就打开数据库文件所在的目录,看看在自己机器运行的过程中有没有产生一个跟数据库文件同名的后缀是ldb的文件,如果有的话就要小心了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-28 22:57:23 | 显示全部楼层
呃....好象一般的数据库操作前,都会有一段测试数据库link是否存在的代码
如果链接存在就不需要再link了
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-28 23:03:37 | 显示全部楼层
哪位有兴趣的可以贡献几个基础代码.
我可以整个通用类出来
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-17 03:53 AM , Processed in 0.014904 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表