前言

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. jsp中的开头的作用

    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1&q ...

  2. Delphi 添加外部Form单元的方法!

    我用到的环境是 RAD Studio 10.2.2 有时候,需要把某个Form单元  添加到其他的工程!  此时,如果直接添加或者拖拉 .pas单元到目标工程,是无法把.pas包含的Form添加进去的 ...

  3. Egret学习笔记 (Egret打飞机-5.实现子弹对象)

    上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...

  4. Create小程序

    我有时候喜欢直接用命令行创建.编译.执行java文件, 每次创建一个文件都要新建一个.java文件,然后再编辑.java文件加入类名,主函数…… 这些流程我有点厌倦,于是就编写了一个超级简单的自动创建 ...

  5. angular aot编译报错 ERROR in ./src/main.ts 解决方法

    昨天打包项目时遇到下图这样的错误: 开始以为了某些模块存在但未使用,折腾一番无果,后来升级angular-cli就搞定了,方法很简单: 1.删掉node_modules 2.更改package.jso ...

  6. Batch Normalization&Dropout浅析

    一. Batch Normalization 对于深度神经网络,训练起来有时很难拟合,可以使用更先进的优化算法,例如:SGD+momentum.RMSProp.Adam等算法.另一种策略则是高改变网络 ...

  7. aforge 学习-命名空间中文理解

    序列 名称 介绍 1 Aforge AForge   AForge名称空间的核心名称空间.微软网络框架,其中包含核心类所使用的其他框架的命名空间和类,可以独立用于各种用途. 2 AForge.Cont ...

  8. Jmeter简单介绍与搭配Jenkins实现自动化

    Jmeter简介 Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具.用于对软件做压力测试,它最初被设计用于 Web应用测试,但后来扩展到其他测试领域. 它可以用于 ...

  9. JVM笔记4-对象的创建

    1.对象的创建过程: 1.new 类名 2.根据new的参数在常量池中定位一个类的符号的引用. 3.如果没找到这个符号的引用,说明类还没有被加载.则进行类的加载,解析和初始化 4.虚拟机为对象分配内存 ...

  10. Luogu P1747 好奇怪的游戏

    题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被 ...