• Acess错误:"文件共享锁定数溢出"


    对于ACCESS数据库,如果通过大量的SQL来操作数据库或者直接操作大量的数据时,经常会出现这种错误:

         "文件共享锁定数溢出"

        原因如下:
        Access数据库,同时操作大量记录(9500条以上)时报错(这是指9500条SQL语句而不是数据的记录数)。
        Microsoft JET Database Engine 错误'80040e21'

       解决办法:

      修改注册表 

       [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Jet4.0]
       "MaxLocksPerFile"=dword:05f5e0ff
       将MaxLocksPerFile默认的十进制值9500改大即可。呵呵,我改成了十进制的99999999

        这里需要注意的地方是这位置是32位系统的位置,而对于64位系统所对应的注册表的位置是不同的。

       [HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Jet/4.0/Engines/Jet 4.0]


    另一种解决方案:

           如果SQL数据量太大(例如:超过60W)的话,经测试即使修改了注册表信息,也无法实现,为此需要另一种解决方案。

         1:首先,复制当前的ACCESS数据库到一个特定的目录下(用于出现异常时,好恢复数据库)。

         2:设置SQL语句每次提交的数量(一般为2W),也就是每2W条SQL语句提交一次(防止出现文件共享锁定数溢出)。

        3:如果在执行SQL语句的过程中出现异常,用备份的数据库覆盖原数据库。

    注意:这个过程中,各个的衔接要多注意。

    代码示例:

                //1:备份当前的数据库到【BACKUPDB】下
                string strAppDir = System.AppDomain.CurrentDomain.BaseDirectory;
                string dbDirFileStr = strAppDir + "DBdata\EduDB.mdb";//原数据库文件
                string backupDbDir = strAppDir + "BACKUPDB";
                DirectoryInfo directoryInfo = new DirectoryInfo(backupDbDir);
                if (!directoryInfo.Exists)
                {
                    directoryInfo.Create();
                }
                //设置文件隐藏
                File.SetAttributes(backupDbDir,FileAttributes.Hidden);
                //是否存在相同的文件,存在就删除
                string backupDbDirFileStr = backupDbDir + "\EduDB.mdb";
                FileInfo dbFileInfo = new FileInfo(backupDbDirFileStr);
                if (dbFileInfo.Exists)
                    System.IO.File.Delete(backupDbDirFileStr);
                IOTool.CopyFiles(dbDirFileStr, backupDbDirFileStr, true);

              //2:设置每10000条SQL语句,做一次提交
                try
                {
                            for (int j = 0; j <count; j++)
                            {
                                //拼接的SQL语句
                                if (j!=0 && j%20000 == 0)
                                {
                                    commitNum++;
                                    DbBusHelp.ExecuteSqlTran(SQLStringList);
                                    SQLStringList.Clear();
                                }
                             }

                             //不足2W条SQL语句数
                             DbBusHelp.ExecuteSqlTran(SQLStringList);
                             SQLStringList.Clear();   
                         }
                    }
                }
                catch (Exception ex)
                {
                    CCLib.MV.LogTool.WriteEduAppLog(ex.Message, ex.StackTrace);
                    //3:出现异常,把备份的数据库恢复,是否关闭数据库连接
                    IOTool.CopyFiles(backupDbDirFileStr, dbDirFileStr, true);
                    return false;
                }


  • 相关阅读:
    软件杯_视频全量目标分析和建模_初步分析
    《一线架构师实践指南》第三部分阅读笔记
    eclipse配置Struts2至Tomcat8.5
    《一线架构师实践指南》阅读笔记02
    Java中对list集合使用HashSet去重不成功
    学习02
    《一线架构师实践指南》阅读笔记01
    通过DOS命令将txt文件导入mysql数据库
    zookeeper集群环境搭建详细图文教程
    SSO之CAS单点登录详细搭建教程
  • 原文地址:https://www.cnblogs.com/liuruitao/p/5122230.html
Copyright © 2020-2023  润新知