急人的难题!Access数据库的实时优化、修复问题 up有分!!! (100分)

  • 主题发起人 主题发起人 lcl800
  • 开始时间 开始时间
L

lcl800

Unregistered / Unconfirmed
GUEST, unregistred user!
用access数据库做服务器,当20个人同时输入数据记录超过5000条时,
数据库出现错误,客户端不能提交数据,当关闭Adoconnection,并在access环境
中执行压缩与修复数据,重新打开Adoconnection,系统运行正常。
怎样实时修复数据库呢,怎样解决这个问题?
数据库建了主键,客户端采用的是追加数据。
 
不懂实时是什么意思,在客户访问时吗?不可能的

压缩代码
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1268352
 
实时就是指用户在运行过程中,也可以一边压缩一边运行程序。
当然不一定采用实时压缩,只要能解决问题就行。
怎样解决这个问题?
 
我整理的两个函数压缩和修复

function TMsAccessTools.CompressDatabase: boolean;
var
ADOMDB: OLEVariant;
begin
Result := True;
if CheckFileName then
begin
ADOMDB := CreateOleObject('DAO.DBEngine.35');
try
ADOMDB.CompactDatabase(FsrcFileName, tmp_FILE);
except
ADOMDB := CreateOleObject('DAO.DBEngine.36');
try
ADOMDB.CompactDatabase(FsrcFileName, tmp_FILE);
except
HintMsgBox(err_COMPRESS);
Result := False;
end;
end;
try
DeleteFile(FsrcFileName);
RenameFile(tmp_FILE,FsrcFileName);
except
HintMsgBox(err_RENAME);
Result := False;
end;
end;
end;

function TMsAccessTools.RepairDatabase: boolean;
var
ADOMDB: OLEVariant;
begin
Result := True;
if CheckFileName then
begin
ADOMDB := CreateOleObject('DAO.DBEngine.35');
try
ADOMDB.RepairDatabase(FsrcFileName);
except
ADOMDB := CreateOleObject('DAO.DBEngine.36');
try
ADOMDB.RepairDatabase(FsrcFileName);
except
HintMsgBox(err_REPAIR);
Result := False;
end;
end;
end;
end;
 
好像有用户连接的时候是不能修复和压缩数据库的
建议你改用SQLServer数据库
Access数据库不适合大数据量的处理,毕竟只是桌面文件型数据库
 
才5000多条记录,ACCESS应该完全没问题的。我的mdb数据库已经达五百多兆,
上百张表,几百万条记录,运行起来仍旧飞快。我的经验,使用ACCESS数据库,应该
选DAO作为数据库引擎,DA0存取ACCESS数据库的效率是最高的(比ADO还要强许多),
ACCESS的文件服务器选择NOVELL要比用NT强许多。修复和压缩数据库只能以独占方式
打开mdb数据库才能进行,修复时ACCESS会自动关闭数据库,修复结束后再重新打开。
实时修复是不可能做到的。
 
复制一份出来,压缩好后,再连接它。呵呵,好像没用。
 
李啸林:
您好!
感谢您的回答。表中的字段一般为多少比较合适?
我使用的是socket连接,采用的方式是向数据库追加,每人每次追加约30条记录。
数据流量为5000条/60分钟, 有哪些具体技巧?
望不吝赐教!
 
倒,这已经比较大的流量了,为什么不用sql server呢?有钱用oracle更好!
用access这时候也许出了问题可以解决,但你很快就会发现,还有很多更痛苦的问题
等着你[^]
 
回lcl800,
socket我没有使用过,所以谈不上什么赐教.我只是稍微熟悉ACCESS数据库的特性而已,
我想我现在大概明白你的问题所在,ACCESS是文件型数据库,尽管ACCESS数据库引擎提供
的是记录级锁定,锁定信息在ldb文件中.但你所提的问题并不发生在ACCESS数据库中
,而是发生在操作系统对mdb分布文件的页面的写锁定,因为锁定的时间相当短,如果
是单用户或者是mdb文件很小或者更新(含添加)记录数很小,这个问题是不会发生的.
ACCESS数据库引擎只到ldb文件中查找锁定信息,因此就有可能发生同一时刻向同一数据块
更改数据的情况发生,一但出现这种情况操作系统自然会立即拒绝这种请求,数据库出现
错误也就不奇怪了。
以上只是我个人对你的问题产生原因一种猜测,不一定正确.如果真的是这种原因
,我的解决方法有两种,其一:减速.即与上一次POST隔一段时间之后(0.01秒或0.05秒或其他)
再进行下一次提交.其二:重复.第一次提交失败之后,继续重试.
还有每日进行压缩是必需的。
 
老大,你的数据库也算大了,为什么不考虑用SQL好象ACCESS太危险了吧,万一你的服务断电你就惨了[?]
 
ACCESS的服务器断电问题并不是很大.
 
个人认为SQL SERVER的提法很具有“中国特色”,无非是SQL SERVER数据数据实在是便宜——大概四元一张的“四合一”光盘就可以搞定。所以很多软件,用了N年也不过只有几十兆(真正录入的用户最多不过三五个),也用什么“C/S”体系
这样做的好处其实有好也有坏,比如一般的进销存软件按理应有“期未结转”功能用来减小数据库的负担,而用SQL SERVER就省事了,带着大量的数据垃圾运转个四五年都没问题,不行就换个服务器 :)
用ACCESS一定要用DAO引擎,用ADO性能很糟,与其半遮半掩的“与SQL SERVER兼容”倒不如干脆用SQL SERVER算了
提交记录考虑用内存表的方式,批提交(也就是“减速”),应该没问题,与SQL SERVER相比,ACCESS的锁定记录方式很原始,至少它是完全根据客户端的要求锁定的,所以必需减少锁定的几率,不然这种文件标记的锁定的形式很不可靠
断电对ACCESS的问题并不大,不像FOXPRO,所以ACCESS还是很优秀的(主要是DAO很优秀),必需注意的是如果是ACCESS 97,至少有两种版本,一种是DAO 350,一种是DAO 351,前者有重大问题,数据库很容易损坏。
 
5000条,改用大型数据库吧!
 
我也建议你用ORACLE绝对不会出现类似问题我敢保
 
不知市面上的ORACLE D版可不可以用,呵呵,有能用的,OK一下
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部