|
@@ -1,9 +1,7 @@
|
|
|
using System;
|
|
|
-using System.Collections.Concurrent;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Threading;
|
|
|
-using System.Threading.Tasks;
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
using SQLitePCL;
|
|
|
using SQLitePCL.pretty;
|
|
@@ -33,8 +31,6 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
private SQLiteDatabaseConnection WriteConnection;
|
|
|
|
|
|
- private readonly BlockingCollection<SQLiteDatabaseConnection> ReadConnectionPool = new BlockingCollection<SQLiteDatabaseConnection>();
|
|
|
-
|
|
|
static BaseSqliteRepository()
|
|
|
{
|
|
|
ThreadSafeMode = raw.sqlite3_threadsafe();
|
|
@@ -43,70 +39,37 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
private string _defaultWal;
|
|
|
|
|
|
- protected async Task CreateConnections()
|
|
|
+ protected ManagedConnection GetConnection(bool isReadOnly = false)
|
|
|
{
|
|
|
- await WriteLock.WaitAsync().ConfigureAwait(false);
|
|
|
-
|
|
|
- try
|
|
|
+ WriteLock.Wait();
|
|
|
+ if (WriteConnection != null)
|
|
|
{
|
|
|
- if (WriteConnection == null)
|
|
|
- {
|
|
|
- WriteConnection = SQLite3.Open(
|
|
|
- DbFilePath,
|
|
|
- DefaultConnectionFlags | ConnectionFlags.Create | ConnectionFlags.ReadWrite,
|
|
|
- null);
|
|
|
- }
|
|
|
+ return new ManagedConnection(WriteConnection, WriteLock);
|
|
|
+ }
|
|
|
|
|
|
- if (string.IsNullOrWhiteSpace(_defaultWal))
|
|
|
- {
|
|
|
- _defaultWal = WriteConnection.Query("PRAGMA journal_mode").SelectScalarString().First();
|
|
|
+ WriteConnection = SQLite3.Open(
|
|
|
+ DbFilePath,
|
|
|
+ DefaultConnectionFlags | ConnectionFlags.Create | ConnectionFlags.ReadWrite,
|
|
|
+ null);
|
|
|
|
|
|
- Logger.LogInformation("Default journal_mode for {0} is {1}", DbFilePath, _defaultWal);
|
|
|
- }
|
|
|
|
|
|
- if (EnableTempStoreMemory)
|
|
|
- {
|
|
|
- WriteConnection.Execute("PRAGMA temp_store = memory");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- WriteConnection.Execute("PRAGMA temp_store = file");
|
|
|
- }
|
|
|
- }
|
|
|
- catch
|
|
|
+ if (string.IsNullOrWhiteSpace(_defaultWal))
|
|
|
{
|
|
|
+ _defaultWal = WriteConnection.Query("PRAGMA journal_mode").SelectScalarString().First();
|
|
|
|
|
|
- throw;
|
|
|
- }
|
|
|
- finally
|
|
|
- {
|
|
|
- WriteLock.Release();
|
|
|
+ Logger.LogInformation("Default journal_mode for {0} is {1}", DbFilePath, _defaultWal);
|
|
|
}
|
|
|
|
|
|
- // Add one reading connection for each thread
|
|
|
- int threads = System.Environment.ProcessorCount;
|
|
|
- for (int i = 0; i <= threads; i++)
|
|
|
- {
|
|
|
- ReadConnectionPool.Add(SQLite3.Open(DbFilePath, DefaultConnectionFlags | ConnectionFlags.ReadOnly, null));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- protected ManagedConnection GetConnection(bool isReadOnly = false)
|
|
|
- {
|
|
|
- if (isReadOnly)
|
|
|
+ if (EnableTempStoreMemory)
|
|
|
{
|
|
|
- return new ManagedConnection(ReadConnectionPool.Take(), ReadConnectionPool);
|
|
|
+ WriteConnection.Execute("PRAGMA temp_store = memory");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (WriteConnection == null)
|
|
|
- {
|
|
|
- throw new InvalidOperationException("Can't access the write connection at this time.");
|
|
|
- }
|
|
|
-
|
|
|
- WriteLock.Wait();
|
|
|
- return new ManagedConnection(WriteConnection, WriteLock);
|
|
|
+ WriteConnection.Execute("PRAGMA temp_store = file");
|
|
|
}
|
|
|
+
|
|
|
+ return new ManagedConnection(WriteConnection, WriteLock);
|
|
|
}
|
|
|
|
|
|
public IStatement PrepareStatement(ManagedConnection connection, string sql)
|
|
@@ -217,14 +180,11 @@ namespace Emby.Server.Implementations.Data
|
|
|
WriteLock.Release();
|
|
|
}
|
|
|
|
|
|
- foreach (var i in ReadConnectionPool)
|
|
|
- {
|
|
|
- i.Dispose();
|
|
|
- }
|
|
|
-
|
|
|
- ReadConnectionPool.Dispose();
|
|
|
+ WriteLock.Dispose();
|
|
|
}
|
|
|
|
|
|
+ WriteConnection = null;
|
|
|
+
|
|
|
_disposed = true;
|
|
|
}
|
|
|
|