最近做了一个盘点的项目,手持设备用的MC1000,选择的数据库是sqlite,开发语言是C#,盘点程序的处理逻辑是
1.扫描货品条码,在货品基础资料表中判断条码是否存在。
2.如果存在则在对应的盘点单据中存入扫描信息。程序用的3层结构,在UI层开启一个全局的connection,然后打开连接,每次执行扫描的方法时,将connection传到数据访问层,然后执行添加或者更新的代码。单发现每扫描6到7次后,程序就会出现假死的状态,后来发现时sqlite没有处理完,等处理完后程序又正常了。
后来我在UI层全局定义了一个transaction,每次和connection一起传到数据访问层,发现速度提升了,不会出现假死的状态,但是如果每次扫描都将事务提交的话,程序速度又降下来了。如果事务不提交,那么数据将不会保存,如果每次都提交事务速度又慢,这种盘点程序又不可能最后一起提交事务,那样会出现数据丢失的情况。请问高手有没有什么办法,每次扫描的数据既要提交,速度还不能太慢。我的程序现在相应时间大约为0.5秒。

解决方案 »

  1.   

    sqlite性能不佳。。直接WIFI连接Pc服务器不就好了,CS模式
      

  2.   

      但是这次用的设备是MC1000 没有WIFI功能,客户那也没有无线网络,上传数据只能通过数据线传输。  等待高手的出现......  在网上看到的方法都是批次执行大量数量的操作,而我的问题则是怎么提升sqlite每次执行的效率,也就是解决sqlite执行多次添加或者更新后,会出现程序假死的状态!
      

  3.   

    sqlite不使用事务(虽然也可以保存数据)跟使用事务,有100倍的速度差。使用事务的操作才比较快。但是这种快,就是基于通常编程时是大量数据(例如500条记录)一次性地commit的。对于你的程序,我觉得基于数据库编程显得太图省事而遇到了麻烦。如果当初基于普通的文件去编程,然后再通过两三步的重构来住不使用sqlite,大概根本不会有这种烦恼,遇到问题只要删除最后的版本而恢复前一个版本就行了。现在已经首先基于数据库了,就只能倒过来,你的数据仍然是每隔几十条才commit一次,而commit之前将这些数据在本地文件同时写(append方式即可)一份,commit成功则清空文件内容。
      

  4.   

    再通过两三步的重构来住不使用sqlite  -->  再通过两三步的重构来逐步使用sqlite
    许多时候,先做一个基于文件的解决方案就好了。
      

  5.   

    回到最原始的嵌入系统编程思路,其实基于文件的方案:数据一直往文件里append,然后后台进程可以在应用程序Idel事件(并且最后一次写数据已经超过5秒钟)的时候才将文件中的数据导入到数据库中并清空文件内容。
      

  6.   

    sqlite虽说型号小点,但查询速度一点也不慢,除非你的数据量很大很大,原因很可能在于你的程序,比如你有没有使用using做连接,资源是否及时消除,有否大图片,也可能是硬件速度慢,可以用每次动作前用GC强制清理垃圾.
      

  7.   

    樓主該不會忘記將 connection 關掉吧???