Sqlite 梳理
前言
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里边新增数据
结语:
附带
Sqlite 梳理的更多相关文章
- iOS面试必看,最全梳理
序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...
- iOS,面试必看,最全梳理
序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...
- Android数据存储三剑客——SharedPreferences、File、SQLite
Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...
- iOS知识点全梳理-备用
感谢大神分享 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e26著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序言 ...
- iOS 面试常见问题最全梳理
序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...
- mina.net 梳理
LZ最近离职,闲着也是闲着,打算梳理下 公司做的是电商,CTO打算把2.0系统用java 语言开发,LZ目前不打算做java,所以 选择离职.离职前,在公司负责的最后一个项目 供应链系统. 系统分为 ...
- iOS知识点全梳理-b
感谢分享 原文链接:http://www.jianshu.com/p/5d2163640e26 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会 ...
- 《Android编程权威指南》CriminalIntent项目梳理
相信很多新手或者初级开发人员都已经买了第2版的<Android编程权威指南>, 这本书基于Android Studio开发,对入门人员来说是很好的选择,但是很可惜的是, 在完成一个项目后, ...
- MySQL、sqlalchemy、pymysql、mysqldb、DBAPI之间关系梳理(终于明白了)
MySQL.sqlalchemy.pymysql.mysqldb.DBAPI之间关系梳理(终于明白了) python3不再支持mysqldb 请用pymysql和mysql.connector 问题背 ...
随机推荐
- jsp中的开头的作用
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1&q ...
- Delphi 添加外部Form单元的方法!
我用到的环境是 RAD Studio 10.2.2 有时候,需要把某个Form单元 添加到其他的工程! 此时,如果直接添加或者拖拉 .pas单元到目标工程,是无法把.pas包含的Form添加进去的 ...
- Egret学习笔记 (Egret打飞机-5.实现子弹对象)
上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...
- Create小程序
我有时候喜欢直接用命令行创建.编译.执行java文件, 每次创建一个文件都要新建一个.java文件,然后再编辑.java文件加入类名,主函数…… 这些流程我有点厌倦,于是就编写了一个超级简单的自动创建 ...
- angular aot编译报错 ERROR in ./src/main.ts 解决方法
昨天打包项目时遇到下图这样的错误: 开始以为了某些模块存在但未使用,折腾一番无果,后来升级angular-cli就搞定了,方法很简单: 1.删掉node_modules 2.更改package.jso ...
- Batch Normalization&Dropout浅析
一. Batch Normalization 对于深度神经网络,训练起来有时很难拟合,可以使用更先进的优化算法,例如:SGD+momentum.RMSProp.Adam等算法.另一种策略则是高改变网络 ...
- aforge 学习-命名空间中文理解
序列 名称 介绍 1 Aforge AForge AForge名称空间的核心名称空间.微软网络框架,其中包含核心类所使用的其他框架的命名空间和类,可以独立用于各种用途. 2 AForge.Cont ...
- Jmeter简单介绍与搭配Jenkins实现自动化
Jmeter简介 Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具.用于对软件做压力测试,它最初被设计用于 Web应用测试,但后来扩展到其他测试领域. 它可以用于 ...
- JVM笔记4-对象的创建
1.对象的创建过程: 1.new 类名 2.根据new的参数在常量池中定位一个类的符号的引用. 3.如果没找到这个符号的引用,说明类还没有被加载.则进行类的加载,解析和初始化 4.虚拟机为对象分配内存 ...
- Luogu P1747 好奇怪的游戏
题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被 ...