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 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下载

 

网站地图xml地图