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 问题背 ...
随机推荐
- SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序
项目地址 https://github.com/guoyaohua/SmileyFace 开发环境 Visual Studio 2010 MFC + OpenCV 功能描述 静态图像人脸检测 视频人脸 ...
- win10安装mongodb及配置 和 mongodb的基本使用(node环境)
mongodb安装 下载地址: https://www.mongodb.com/download-center 下载后,我们点击mongodb-win32-x86_64-2008plus-ssl-3. ...
- Linux CentOS7下安装python3
在CentOS7下,默认安装的就是python2.7,我现在来教大家如何安装python3: 1.首先安装python3.6可能使用的依赖 # yum -y install openssl-devel ...
- 玩转FFmpeg的7个小技巧
FFmpeg堪称音频和视频应用程序的瑞士军刀,提供了丰富的选项和灵活性.很多时候用户为了看视频和听音乐都安装了ffmeg.更多关于ffmeg的详细介绍:here,可以通过ffmpeg -formats ...
- java.lang.NumberFormatException
1.错误描述 Exception in thread "main" java.lang.NumberFormatException: For input string: " ...
- but the supplied types were (flex.messaging.io.amf.ASObject) and converted to (null)."
1.错误描述 [RPC Fault faultString="Cannot invoke method 'saveOrUpdate'. " faultCode="Ser ...
- web开发性能优化---代码优化篇
1.合理使用缓存使用 提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存.Asp.net下的缓存机制十分强大,用好缓存机制可以让我们极大的改善web应用的性能. 1.页 ...
- 芝麻HTTP:redis-py的安装
对于Redis来说,我们要使用redis-py库来与其交互,这里就来介绍一下它的安装方法. 1. 相关链接 GitHub:https://github.com/andymccurdy/redis-py ...
- html基础加强2
1.表单元素 表单元素一定要提交在form标签里面 2.id和name 所有元素都有ID,但只有表单元素才有name ID不可以重复,name可以重复 name属性的目的时可以将数据提交到服务器.id ...
- [QNAP crontab 定時執行程式
注意要自動執行的 sh 檔不要放在 /root 裡, 不然韌體更新後檔案會不見, 要放在個人帳號的資料夾,例如 /share/homes/帳號/ QNAP 的 crontab 放在 /etc/conf ...