前言

LZ最近失业,梳理下最近一个项目的 项目结构-供应链系统

接着上一篇博客 http://www.cnblogs.com/buruainiaaaa/p/6786527.html

上篇说到整套系统分为3套子系统,这篇 说下缓存结构

Sqlite 简介:

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。(比较官方)

其官网地址 https://www.sqlite.org/

LZ打算说下自己眼中的Sqlite:

1.自给自足:sqlite能够包含自己的表,试图,索引,事物 等等

2.无服务器:纯文件形式,不需要跟sqlserver一样 启动系统服务。

3.零配置:文件不需要任何配置,只需要配置db文件的路径即可,使用方便

4.事物性:sqlite 支持参数化,事物回滚

5.轻量级,跨平台

但是 sqlite 也不是没有缺点,LZ个人认为,最大的不足就是:并发写

sqlite 比较使用于做CS端的缓存,一整套业务系统 难免会有多个子系统,在进行sqlite 操作的时候,肯定会出现并发写的情况,这种情况下就需要对写 进行控制

进程互斥锁Mutex

这里 我就不介绍Mutex 是什么,总之 Mutex 能解决 sqlite 在多进程 多线程情况下的 互斥问题

  1. private Mutex writerLock = new Mutex(false, "Global\\JiupiSqlLite");

  等待

  1. writerLock.WaitOne(30000)

  释放

  1. writerLock.ReleaseMutex();

使用互斥锁,保证写操作的互斥性

  1. public class SqliteConnMutex : IDisposable
  2. {
  3. /// <summary>
  4. /// 互斥锁
  5. /// </summary>
  6. private Mutex writerLock = new Mutex(false, "Global\\MySqlLite");
  7.  
  8. /// <summary>
  9. /// 互斥锁保护对象
  10. /// </summary>
  11. private SQLiteConnection connection = null;
  12.  
  13. /// <summary>
  14. /// 获取写操作连接
  15. /// </summary>
  16. /// <returns></returns>
  17. public SQLiteConnection GetConnection()
  18. {
  19. try
  20. {
  21. while (true)
  22. {
  23. if (writerLock.WaitOne(30000))
  24. {
  25. if (connection.State == System.Data.ConnectionState.Closed)
  26. {
  27. connection = new SQLiteConnection(SQLiteHelper.connectionString);
  28. }
  29. return connection;
  30. }
  31. Thread.Sleep(1000);
  32. }
  33. }
  34. catch (Exception ex)
  35. {
  36. throw ex;
  37. }
  38. }
  39.  
  40. //供程序员显式调用的Dispose方法
  41. public void Dispose()
  42. {
  43. Dispose(true);
  44. }
  45.  
  46. //protected的Dispose方法,保证不会被外部调用。
  47. protected void Dispose(bool disposing)
  48. {
  49. if (disposing)
  50. {
  51. try
  52. {
  53. writerLock.ReleaseMutex();
  54. }
  55. catch (Exception ex)
  56. {
  57. }
  58. }
  59. }
  60.  
  61. }

  

SQLiteHelper对sqlite 写操作的调用

  1. /// <summary>
  2. /// 进程锁
  3. /// </summary>
  4. /// <param name="SQLString"></param>
  5. /// <returns></returns>
  6. public static int ExecuteMutexSql(string SQLString, SQLiteParameter[] param = null)
  7. {
  8. SQLiteConnection connection = null;
  9. try
  10. {
  11. using (SqliteConnMutex mutex = new SqliteConnMutex())
  12. {
  13. connection = mutex.GetConnection();
  14. if (connection == null)
  15. {
  16. throw new Exception("connection对象错误");
  17. }
  18. if (connection == null)
  19. {
  20. throw new Exception("connection不能为空");
  21. }
  22. using (SQLiteCommand cmd = new SQLiteCommand())
  23. {
  24. try
  25. {
  26. if (connection.State != ConnectionState.Open)
  27. {
  28. connection.Open();
  29. }
  30. PrepareCommand(cmd, connection, null, SQLString, param);
  31. //Thread.Sleep(100);
  32. int rows = cmd.ExecuteNonQuery();
  33. return rows;
  34. }
  35. catch (System.Data.SQLite.SQLiteException E)
  36. {
  37. if (connection != null && connection.State != ConnectionState.Closed)
  38. {
  39. connection.Clone();
  40. }
  41. throw new Exception(E.Message);
  42. }
  43. }
  44. }
  45. }
  46. catch (Exception ex)
  47. {
  48.  
  49. throw ex;
  50. }
  51.  
  52. }

  sqlite 读操作的 方法封装

  1. /// <summary>
  2. /// 执行查询语句,返回DataSet
  3. /// </summary>
  4. /// <param name="SQLString">查询语句</param>
  5. /// <returns>DataSet</returns>
  6. public static DataSet Query(string SQLString)
  7. {
  8. using (SQLiteConnection connection = new SQLiteConnection(connectionString))
  9. {
  10. DataSet ds = new DataSet();
  11. try
  12. {
  13. connection.Open();
  14. SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
  15. command.Fill(ds, "ds");
  16. }
  17. catch (System.Data.SQLite.SQLiteException ex)
  18. {
  19. throw new Exception(ex.Message);
  20. }
  21. return ds;
  22. }
  23. }

  经过测试,在 多线程,多进程情况下,可以往同一个db里边新增数据

结语:

附带

System.Data.SQLite.dll下载

Sqlite 梳理的更多相关文章

  1. iOS面试必看,最全梳理

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...

  2. iOS,面试必看,最全梳理

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...

  3. Android数据存储三剑客——SharedPreferences、File、SQLite

    Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...

  4. iOS知识点全梳理-备用

    感谢大神分享 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e26著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序言 ...

  5. iOS 面试常见问题最全梳理

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...

  6. mina.net 梳理

    LZ最近离职,闲着也是闲着,打算梳理下 公司做的是电商,CTO打算把2.0系统用java 语言开发,LZ目前不打算做java,所以 选择离职.离职前,在公司负责的最后一个项目 供应链系统. 系统分为 ...

  7. iOS知识点全梳理-b

    感谢分享 原文链接:http://www.jianshu.com/p/5d2163640e26 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会 ...

  8. 《Android编程权威指南》CriminalIntent项目梳理

    相信很多新手或者初级开发人员都已经买了第2版的<Android编程权威指南>, 这本书基于Android Studio开发,对入门人员来说是很好的选择,但是很可惜的是, 在完成一个项目后, ...

  9. MySQL、sqlalchemy、pymysql、mysqldb、DBAPI之间关系梳理(终于明白了)

    MySQL.sqlalchemy.pymysql.mysqldb.DBAPI之间关系梳理(终于明白了) python3不再支持mysqldb 请用pymysql和mysql.connector 问题背 ...

随机推荐

  1. Angular CurrencyPipe货币管道关于人民币符号¥的问题

    做项目(Angular项目)时经常需要处理金额的显示,需要在金额前面加上¥,但又不想用简单在前面加"¥"这么不优雅的方式,于是想到了CurrencyPipe.毕竟,Currency ...

  2. 决策树--ID3 算法(一)

    Contents      1. 决策树的基本认识      2. ID3算法介绍      3. 信息熵与信息增益      4. ID3算法的C++实现 1. 决策树的基本认识    决策树是一种 ...

  3. Redis笔记2-发布订阅

    发布/订阅"(publish/subscribe)模式可以实现进程间通信,订阅者可以订阅一个或多个频道(channel),而发布者可以向指定的频道发送消息,所有订阅次频道的订阅者都会收到次消 ...

  4. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  5. Win11曝光 代号“Core OS” 明年推出-IT外包

    Win10发布距今已经有两年半的时间了,微软对其"修修补补"也有五次了,而第六次的更新也正在进行中.根据消息爆料,Win 11级别的开发项目"Windows Core O ...

  6. 火狐浏览器导出EXCEL 表格,文件名乱码问题

    牢骚:今天又是一个不太平的日子,打开任务表一看里面有一堆bug,其中有一个就是今天要说的这个关于商品导出的问题,本功能是临时授命接一个任务,本来呢这个导出功能在系统各大模块已经都很成熟了,但是总有一个 ...

  7. java I/O框架 (一)总览

    一.前言 java io框架非常庞大,各种功能的类让人目不暇接,为了系统学习io框架,搜集了各种资料,整理出这篇文章,尽可能详细的讲述java io框架,其中会牵扯到许多信息,不仅包括框架内各种类的方 ...

  8. Android设置View抖动动画

    在应用中,有时候我们要吸引用户去点击某些按钮,比如应用市场的推荐按钮,为了能够吸引用户主动点击而且不过分的打扰用户,最好的方法就是给我们想吸引用户注意的view添加一些抖动动画,比如这张图 这里我主要 ...

  9. tensorflow+入门笔记︱基本张量tensor理解与tensorflow运行结构

    Gokula Krishnan Santhanam认为,大部分深度学习框架都包含以下五个核心组件: 张量(Tensor) 基于张量的各种操作 计算图(Computation Graph) 自动微分(A ...

  10. Ubuntu 11.04安装arm-linux-gcc-4.4.3/arm-none-linux-gnueabi-gcc安装包

    准备工具和系统 arm-linux-gcc-4.4.3.tar.gz arm-linux-gcc-4.4.3下载地址: 下载在Linux公社的1号FTP服务器里,下载地址: FTP地址:ftp://w ...