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 问题背 ...
随机推荐
- Java上传Excel并解析
1.上传: public String uploadFile(CommonsMultipartFile file,String uploadPath,String realUploadPath){ I ...
- js中的写出想jquery中的函数一样调用
1.IIFE: Immediately-Invoked function Expression 函数模块自调用 2.代码实现 <!DOCTYPE html> <html lang=& ...
- Java中的volatile的作用和synchronized作用
volatile该关键字是主要使用的场合是字啊多个线程中可以感知实例的变量被更改了并且可以获取到最新的值进行使用,也就是用多线程读取共享变量的时候可以获取到最新的值使用.不能保障原子性 如果你在jvm ...
- 通过js区分移动端浏览器(微信浏览器、QQ浏览器、QQ内置浏览器)
由于公司业务中涉及到一个分享指引功能,而像微信.QQ内置浏览器需要引导用户点击右上角进行操作,其他浏览器则引导点击浏览器下方进行操作,因此需要区分浏览器类型: 通过在页面alert(navigator ...
- 史上最全的FTP网址
无帐号密码的为匿名登录 ftp://202.114.1.121 ftp://202.114.10.199 ftp://warez:cn.ftp@202.114.12.174 ftp://Music2: ...
- LOJ116 - 有源汇有上下界最大流
原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...
- Codeforces 257D
题意略. 思路:这个题目最重要的是那个不等式 a[i] <= a[i+1] <= 2 * a[i] ,你会发现0 <= a[i+1] - a[i] <= a[i],令x ...
- linux mysql重启命令
1.通过rpm包安装的MySQL 1 2 service mysqld restart /etc/inint.d/mysqld start 2.从源码包安装的MySQL 1 2 3 4 // Linu ...
- Django2.0文档
第四章 模板 1.标签 (1)if/else {% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在 {% if %} 和 {% e ...
- android DecorView深入理解
开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局.页面都是依附在窗口之上的,而DecorView即是窗口最顶 ...