前言

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 在多进程 多线程情况下的 互斥问题

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

  等待

writerLock.WaitOne(30000)

  释放

writerLock.ReleaseMutex();

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

 public class SqliteConnMutex : IDisposable
{
/// <summary>
/// 互斥锁
/// </summary>
private Mutex writerLock = new Mutex(false, "Global\\MySqlLite"); /// <summary>
/// 互斥锁保护对象
/// </summary>
private SQLiteConnection connection = null; /// <summary>
/// 获取写操作连接
/// </summary>
/// <returns></returns>
public SQLiteConnection GetConnection()
{
try
{
while (true)
{
if (writerLock.WaitOne(30000))
{
if (connection.State == System.Data.ConnectionState.Closed)
{
connection = new SQLiteConnection(SQLiteHelper.connectionString);
}
return connection;
}
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
throw ex;
}
} //供程序员显式调用的Dispose方法
public void Dispose()
{
Dispose(true);
} //protected的Dispose方法,保证不会被外部调用。
protected void Dispose(bool disposing)
{
if (disposing)
{
try
{
writerLock.ReleaseMutex();
}
catch (Exception ex)
{
}
}
} }

  

SQLiteHelper对sqlite 写操作的调用

/// <summary>
/// 进程锁
/// </summary>
/// <param name="SQLString"></param>
/// <returns></returns>
public static int ExecuteMutexSql(string SQLString, SQLiteParameter[] param = null)
{
SQLiteConnection connection = null;
try
{
using (SqliteConnMutex mutex = new SqliteConnMutex())
{
connection = mutex.GetConnection();
if (connection == null)
{
throw new Exception("connection对象错误");
}
if (connection == null)
{
throw new Exception("connection不能为空");
}
using (SQLiteCommand cmd = new SQLiteCommand())
{
try
{
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
PrepareCommand(cmd, connection, null, SQLString, param);
//Thread.Sleep(100);
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SQLite.SQLiteException E)
{
if (connection != null && connection.State != ConnectionState.Closed)
{
connection.Clone();
}
throw new Exception(E.Message);
}
}
}
}
catch (Exception ex)
{ throw ex;
} }

  sqlite 读操作的 方法封装

 /// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="SQLString">查询语句</param>
/// <returns>DataSet</returns>
public static DataSet Query(string SQLString)
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
DataSet ds = new DataSet();
try
{
connection.Open();
SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
command.Fill(ds, "ds");
}
catch (System.Data.SQLite.SQLiteException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}

  经过测试,在 多线程,多进程情况下,可以往同一个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. lamp环境部署脚本

    关于lamp环境的安装脚本,直接复制即可使用 注:apache2.2.X 版本和apache2.4.X版本 本人推荐兼容性版本安装 apache2.4.25 + apr1.5.2 + apr-util ...

  2. Activiti获取ProcessEngine的三种方法

    1.通过ProcessEngineConfiguration获取 package cn.lonecloud.mavenActivi; import org.activiti.engine.Proces ...

  3. 各种语系的unicode对应以及local编码方式

    链接:http://www.doc88.com/p-801578373970.html 一.英文 Unicode范围: 0041-005A, 0061-007A (若含数字与符号,则为0021-007 ...

  4. Django在form提交CSRF验证失败. 相应中断问题

    CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因. Your browser is accepting cookies. The view function passe ...

  5. PhpStorm如何下载github上的代码到本地

    1.看着菜单栏有一个VCS(Virus Capture Scripter)集群服务器的选项,选择其下面的Checkout from Version Control,然后 (1)选择GIT:输入git的 ...

  6. weak alias

    Weak Alias 跟 Weak Reference 完全没有任何关系,不过是我在看到 Weak Reference 的时候想到的而已. Weak Alias 是 gcc 扩展里的东西,实际上是函数 ...

  7. Ubutu Chrome 出现adobe flash is out of date的解决方法

    我们需要到官网下载flash player,网址:https://get.adobe.com/flashplayer/ 不过这里要说明一下: 一般的浏览器使用的是npapi,即adobe flash ...

  8. ClientAbortException: java.net.SocketException: Software caused connection abort: socket write erro

    1.错误描述 ClientAbortException: java.net.SocketException: Software caused connection abort: socket writ ...

  9. hdu5893 List wants to travel

    裸的树链剖分加线段树区间修改 区间合并时需要多注意一点 当时写的很慢 理解不深刻 #include<bits/stdc++.h> using namespace std; const in ...

  10. 简单bfs(hdu2612)

    #include<stdio.h>#include<string.h>#include<queue>#define INF 0x3f3f3f3fusing name ...