提交记录修改Core/Librarys/SQLite/TaiDbContext.cs+2 −1看文件
修改Core/Servicers/Instances/AppData.cs+56 −19看文件
修改Core/Servicers/Instances/Data.cs+4 −6看文件
修改Core/Servicers/Instances/Database.cs+43 −28看文件
| @@ -48,7 +48,8 @@ namespace Core.Librarys.SQLite | ||
| 48 | 48 | public TaiDbContext() |
| 49 | 49 | : base(new SQLiteConnection() |
| 50 | 50 | { |
| 51 | 删除: ConnectionString = $"Data Source={_dbFilePath}" | |
| 51 | 新增: ConnectionString = $"Data Source={_dbFilePath}", | |
| 52 | 新增: BusyTimeout = 60 | |
| 52 | 53 | }, true) |
| 53 | 54 | { |
| 54 | 55 | DbConfiguration.SetConfiguration(new SQLiteConfiguration()); |
| @@ -1,4 +1,5 @@ | ||
| 1 | 删除:using Core.Librarys.SQLite; | |
| 1 | 新增:using Core.Librarys; | |
| 2 | 新增:using Core.Librarys.SQLite; | |
| 2 | 3 | using Core.Models; |
| 3 | 4 | using Core.Servicers.Interfaces; |
| 4 | 5 | using System; |
| @@ -16,6 +17,7 @@ namespace Core.Servicers.Instances | ||
| 16 | 17 | private List<AppModel> _apps; |
| 17 | 18 | |
| 18 | 19 | private readonly IDatabase _databse; |
| 20 | 新增: private readonly object _locker = new object(); | |
| 19 | 21 | public AppData(IDatabase databse) |
| 20 | 22 | { |
| 21 | 23 | _databse = databse; |
| @@ -56,46 +58,81 @@ namespace Core.Servicers.Instances | ||
| 56 | 58 | /// 更新app数据,要先调用GetApp获得后更改并传回才有效 |
| 57 | 59 | /// </summary> |
| 58 | 60 | /// <param name="app"></param> |
| 59 | 删除: public void UpdateApp(AppModel app) | |
| 61 | 新增: public void UpdateApp(AppModel app_) | |
| 60 | 62 | { |
| 61 | 删除: using (var db = _databse.GetWriterContext()) | |
| 63 | 新增: try | |
| 62 | 64 | { |
| 63 | 删除: db.Entry(app).State = System.Data.Entity.EntityState.Modified; | |
| 64 | 删除: db.SaveChanges(); | |
| 65 | 删除: _databse.CloseWriter(); | |
| 65 | 新增: using (var db = _databse.GetWriterContext()) | |
| 66 | 新增: { | |
| 67 | 新增: var app = db.App.FirstOrDefault(c => c.ID.Equals(app_.ID)); | |
| 68 | 新增: if (app != null) | |
| 69 | 新增: { | |
| 70 | 新增: app.TotalTime = app_.TotalTime; | |
| 71 | 新增: app.IconFile = app_.IconFile; | |
| 72 | 新增: app.Name = app_.Name; | |
| 73 | 新增: app.Description = app_.Description; | |
| 74 | 新增: app.File = app_.File; | |
| 75 | 新增: app.CategoryID = app_.CategoryID; | |
| 76 | 新增: db.SaveChanges(); | |
| 77 | 新增: } | |
| 78 | 新增: _databse.CloseWriter(); | |
| 79 | 新增: } | |
| 80 | 新增: } | |
| 81 | 新增: catch(Exception e) | |
| 82 | 新增: { | |
| 83 | 新增: Logger.Error(e.ToString()); | |
| 66 | 84 | } |
| 67 | 85 | } |
| 68 | 86 | public AppModel GetApp(string name) |
| 69 | 87 | { |
| 70 | 删除: return _apps.Where(m => m.Name == name).FirstOrDefault(); | |
| 88 | 新增: lock (_locker) | |
| 89 | 新增: { | |
| 90 | 新增: return _apps.Where(m => m.Name == name).FirstOrDefault(); | |
| 91 | 新增: } | |
| 71 | 92 | } |
| 72 | 93 | public AppModel GetApp(int id) |
| 73 | 94 | { |
| 74 | 删除: return _apps.Where(m => m.ID == id).FirstOrDefault(); | |
| 95 | 新增: lock (_locker) | |
| 96 | 新增: { | |
| 97 | 新增: return _apps.Where(m => m.ID == id).FirstOrDefault(); | |
| 98 | 新增: } | |
| 75 | 99 | } |
| 76 | 100 | public void AddApp(AppModel app) |
| 77 | 101 | { |
| 78 | 删除: if (_apps.Where(m => m.Name == app.Name).Any()) | |
| 102 | 新增: lock (_locker) | |
| 79 | 103 | { |
| 80 | 删除: return; | |
| 81 | 删除: } | |
| 104 | 新增: if (_apps.Where(m => m.Name == app.Name).Any()) | |
| 105 | 新增: { | |
| 106 | 新增: return; | |
| 107 | 新增: } | |
| 108 | 新增: try | |
| 109 | 新增: { | |
| 110 | 新增: using (var db = _databse.GetWriterContext()) | |
| 111 | 新增: { | |
| 112 | 新增: var r = db.App.Add(app); | |
| 113 | 新增: int res = db.SaveChanges(); | |
| 114 | 新增: if (res > 0) | |
| 115 | 新增: { | |
| 116 | 新增: Debug.WriteLine("add done!" + r.ID); | |
| 82 | 117 | |
| 83 | 删除: using (var db = _databse.GetWriterContext()) | |
| 84 | 删除: { | |
| 85 | 删除: db.App.Add(app); | |
| 86 | 删除: int res = db.SaveChanges(); | |
| 87 | 删除: if (res > 0) | |
| 118 | 新增: _apps.Add(app); | |
| 119 | 新增: } | |
| 120 | 新增: _databse.CloseWriter(); | |
| 121 | 新增: } | |
| 122 | 新增: }catch(Exception e) | |
| 88 | 123 | { |
| 89 | 删除: _apps.Add(app); | |
| 124 | 新增: Logger.Error(e.ToString()); | |
| 90 | 125 | } |
| 91 | 删除: _databse.CloseWriter(); | |
| 92 | 126 | } |
| 93 | 127 | } |
| 94 | 128 | |
| 95 | 129 | |
| 96 | 130 | public List<AppModel> GetAppsByCategoryID(int categoryID) |
| 97 | 131 | { |
| 98 | 删除: return _apps.Where(m => m.CategoryID == categoryID).ToList(); | |
| 132 | 新增: lock (_locker) | |
| 133 | 新增: { | |
| 134 | 新增: return _apps.Where(m => m.CategoryID == categoryID).ToList(); | |
| 135 | 新增: } | |
| 99 | 136 | } |
| 100 | 137 | } |
| 101 | 138 | } |
| @@ -14,7 +14,6 @@ using System.IO; | ||
| 14 | 14 | using CsvHelper; |
| 15 | 15 | using System.Globalization; |
| 16 | 16 | using System.Threading.Tasks; |
| 17 | 删除:using NPOI.SS.Formula.Functions; | |
| 18 | 17 | |
| 19 | 18 | namespace Core.Servicers.Instances |
| 20 | 19 | { |
| @@ -111,23 +110,22 @@ namespace Core.Servicers.Instances | ||
| 111 | 110 | } |
| 112 | 111 | |
| 113 | 112 | db.SaveChanges(); |
| 114 | 删除: _database.CloseWriter(); | |
| 115 | 113 | Logger.Info($"Save app time done.Process:{processName_},Duration:{duration_},StartDateTime:{startDateTime_},AppID:{app.ID}"); |
| 116 | 114 | } |
| 117 | 115 | } |
| 118 | 116 | catch (Exception e) |
| 119 | 117 | { |
| 120 | 118 | Logger.Error($"Save app time error!Process:{processName_},Duration:{duration_},StartDateTime:{startDateTime_}.\r\nError:\r\n{e.Message}"); |
| 121 | 删除: | |
| 119 | 新增: } | |
| 120 | 新增: finally | |
| 121 | 新增: { | |
| 122 | 新增: _database.CloseWriter(); | |
| 122 | 123 | } |
| 123 | 124 | }); |
| 124 | 125 | } |
| 125 | 126 | |
| 126 | 127 | public List<DailyLogModel> GetTodaylogList() |
| 127 | 128 | { |
| 128 | 删除: | |
| 129 | 删除: //return null; | |
| 130 | 删除: | |
| 131 | 129 | using (var db = _database.GetReaderContext()) |
| 132 | 130 | { |
| 133 | 131 | var today = DateTime.Now.Date; |
| @@ -2,8 +2,10 @@ | ||
| 2 | 2 | using Core.Servicers.Interfaces; |
| 3 | 3 | using System; |
| 4 | 4 | using System.Collections.Generic; |
| 5 | 新增:using System.Data.SQLite; | |
| 5 | 6 | using System.Diagnostics; |
| 6 | 7 | using System.Linq; |
| 8 | 新增:using System.Runtime.CompilerServices; | |
| 7 | 9 | using System.Text; |
| 8 | 10 | using System.Threading; |
| 9 | 11 | using System.Threading.Tasks; |
| @@ -12,55 +14,65 @@ namespace Core.Servicers.Instances | ||
| 12 | 14 | { |
| 13 | 15 | public class Database : IDatabase |
| 14 | 16 | { |
| 15 | 删除: //private TaiDbContext _readerContext; | |
| 16 | 17 | private TaiDbContext _writerContext; |
| 17 | 删除: private readonly object _locker = new object(); | |
| 18 | 删除: private bool _locked = false; | |
| 19 | 删除: private int _outTime = 10; | |
| 18 | 新增: private readonly object _writeLocker = new object(); | |
| 19 | 新增: private readonly object _readLocker = new object(); | |
| 20 | 新增: private readonly object _closeLocker = new object(); | |
| 21 | 新增: private int _outTime = 60; | |
| 22 | 新增: private int _readerNum = 0; | |
| 23 | 新增: private bool _isWriting = false; | |
| 20 | 24 | private bool _isReading = false; |
| 21 | 25 | public TaiDbContext GetReaderContext() |
| 22 | 26 | { |
| 23 | 删除: lock (_locker) | |
| 27 | 新增: lock (_readLocker) | |
| 24 | 28 | { |
| 25 | 删除: int lockTime = 0; | |
| 26 | 删除: while (_locked) | |
| 29 | 新增: _isReading = true; | |
| 30 | 新增: int duration = 0; | |
| 31 | 新增: while (_isWriting) | |
| 27 | 32 | { |
| 28 | 删除: Thread.Sleep(100); | |
| 29 | 删除: lockTime += 100; | |
| 30 | 删除: if (lockTime >= _outTime * 1000) | |
| 33 | 新增: Thread.Sleep(1000); | |
| 34 | 新增: duration++; | |
| 35 | 新增: if (duration >= _outTime) | |
| 31 | 36 | { |
| 32 | 删除: _locked = false; | |
| 37 | 新增: break; | |
| 33 | 38 | } |
| 34 | 39 | } |
| 35 | 删除: //_locked = true; | |
| 36 | 删除: | |
| 37 | 删除: //_readerContext = new TaiDbContext(); | |
| 38 | 删除: //return _readerContext; | |
| 39 | 删除: return new TaiDbContext(); | |
| 40 | 新增: _writerContext?.Dispose(); | |
| 41 | 新增: _readerNum++; | |
| 42 | 新增: var db = new TaiDbContext(); | |
| 43 | 新增: db.Database.Connection.StateChange += Connection_StateChange; | |
| 44 | 新增: return db; | |
| 40 | 45 | } |
| 41 | 46 | } |
| 42 | 47 | |
| 48 | 新增: private void Connection_StateChange(object sender, System.Data.StateChangeEventArgs e) | |
| 49 | 新增: { | |
| 50 | 新增: if (e.CurrentState == System.Data.ConnectionState.Closed) | |
| 51 | 新增: { | |
| 52 | 新增: _readerNum--; | |
| 53 | 新增: _isReading = _readerNum > 0; | |
| 54 | 新增: } | |
| 55 | 新增: } | |
| 56 | 新增: | |
| 43 | 57 | public void CloseReader() |
| 44 | 58 | { |
| 45 | 删除: //_readerContext?.Dispose(); | |
| 46 | 59 | } |
| 47 | 60 | |
| 48 | 61 | public TaiDbContext GetWriterContext() |
| 49 | 62 | { |
| 50 | 删除: lock (_locker) | |
| 63 | 新增: lock (_writeLocker) | |
| 51 | 64 | { |
| 52 | 删除: int lockTime = 0; | |
| 53 | 删除: while (_locked) | |
| 65 | 新增: int duration = 0; | |
| 66 | 新增: while (_isWriting || _isReading) | |
| 54 | 67 | { |
| 55 | 删除: Thread.Sleep(100); | |
| 56 | 删除: lockTime += 100; | |
| 57 | 删除: if (lockTime >= _outTime * 1000) | |
| 68 | 新增: Thread.Sleep(1000); | |
| 69 | 新增: duration++; | |
| 70 | 新增: if (duration >= _outTime) | |
| 58 | 71 | { |
| 59 | 删除: _locked = false; | |
| 72 | 新增: break; | |
| 60 | 73 | } |
| 61 | 74 | } |
| 62 | 删除: _locked = true; | |
| 63 | 删除: | |
| 75 | 新增: _isWriting = true; | |
| 64 | 76 | _writerContext = new TaiDbContext(); |
| 65 | 77 | return _writerContext; |
| 66 | 78 | } |
| @@ -68,8 +80,11 @@ namespace Core.Servicers.Instances | ||
| 68 | 80 | |
| 69 | 81 | public void CloseWriter() |
| 70 | 82 | { |
| 71 | 删除: _writerContext?.Dispose(); | |
| 72 | 删除: _locked = false; | |
| 83 | 新增: lock (_closeLocker) | |
| 84 | 新增: { | |
| 85 | 新增: _writerContext?.Dispose(); | |
| 86 | 新增: _isWriting = false; | |
| 87 | 新增: } | |
| 73 | 88 | } |
| 74 | 89 | } |
| 75 | 90 | } |

