mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-07-09 03:04:24 -04:00
bulk save items when possible
This commit is contained in:
parent
6253578629
commit
f546f09c71
@ -691,16 +691,10 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var saveTasks = new List<Task>();
|
await LibraryManager.CreateItems(newItems, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
foreach (var item in newItems)
|
foreach (var item in newItems)
|
||||||
{
|
{
|
||||||
if (saveTasks.Count > 50)
|
|
||||||
{
|
|
||||||
await Task.WhenAll(saveTasks).ConfigureAwait(false);
|
|
||||||
saveTasks.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_children.TryAdd(item.Id, item))
|
if (!_children.TryAdd(item.Id, item))
|
||||||
{
|
{
|
||||||
Logger.Error("Failed to add {0}", item.Name);
|
Logger.Error("Failed to add {0}", item.Name);
|
||||||
@ -709,12 +703,8 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
{
|
{
|
||||||
Logger.Debug("** " + item.Name + " Added to library.");
|
Logger.Debug("** " + item.Name + " Added to library.");
|
||||||
}
|
}
|
||||||
|
|
||||||
saveTasks.Add(LibraryManager.CreateItem(item, CancellationToken.None));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await Task.WhenAll(saveTasks).ConfigureAwait(false);
|
|
||||||
|
|
||||||
await LibraryManager.SaveChildren(Id, newChildren, CancellationToken.None).ConfigureAwait(false);
|
await LibraryManager.SaveChildren(Id, newChildren, CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
||||||
//force the indexes to rebuild next time
|
//force the indexes to rebuild next time
|
||||||
|
@ -184,6 +184,14 @@ namespace MediaBrowser.Controller.Library
|
|||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
Task CreateItem(BaseItem item, CancellationToken cancellationToken);
|
Task CreateItem(BaseItem item, CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the items.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="items">The items.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
Task CreateItems(IEnumerable<BaseItem> items, CancellationToken cancellationToken);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the item.
|
/// Updates the item.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -64,5 +64,13 @@ namespace MediaBrowser.Controller.Persistence
|
|||||||
/// <param name="criticReviews">The critic reviews.</param>
|
/// <param name="criticReviews">The critic reviews.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
Task SaveCriticReviews(Guid itemId, IEnumerable<ItemReview> criticReviews);
|
Task SaveCriticReviews(Guid itemId, IEnumerable<ItemReview> criticReviews);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Saves the items.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="items">The items.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
Task SaveItems(IEnumerable<BaseItem> items, CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1036,13 +1036,31 @@ namespace MediaBrowser.Server.Implementations.Library
|
|||||||
/// <param name="item">The item.</param>
|
/// <param name="item">The item.</param>
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
public async Task CreateItem(BaseItem item, CancellationToken cancellationToken)
|
public Task CreateItem(BaseItem item, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await SaveItem(item, cancellationToken).ConfigureAwait(false);
|
return CreateItems(new[] { item }, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the items.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="items">The items.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
public async Task CreateItems(IEnumerable<BaseItem> items, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var list = items.ToList();
|
||||||
|
|
||||||
|
await ItemRepository.SaveItems(list, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
foreach (var item in list)
|
||||||
|
{
|
||||||
UpdateItemInLibraryCache(item);
|
UpdateItemInLibraryCache(item);
|
||||||
|
}
|
||||||
|
|
||||||
if (ItemAdded != null)
|
if (ItemAdded != null)
|
||||||
|
{
|
||||||
|
foreach (var item in list)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -1054,6 +1072,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the item.
|
/// Updates the item.
|
||||||
@ -1063,7 +1082,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
|||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
public async Task UpdateItem(BaseItem item, CancellationToken cancellationToken)
|
public async Task UpdateItem(BaseItem item, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await SaveItem(item, cancellationToken).ConfigureAwait(false);
|
await ItemRepository.SaveItem(item, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
UpdateItemInLibraryCache(item);
|
UpdateItemInLibraryCache(item);
|
||||||
|
|
||||||
@ -1099,17 +1118,6 @@ namespace MediaBrowser.Server.Implementations.Library
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Saves the item.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="item">The item.</param>
|
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
|
||||||
/// <returns>Task.</returns>
|
|
||||||
private Task SaveItem(BaseItem item, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
return ItemRepository.SaveItem(item, cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Retrieves the item.
|
/// Retrieves the item.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -172,13 +172,34 @@ namespace MediaBrowser.Server.Implementations.Sqlite
|
|||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
/// <exception cref="System.ArgumentNullException">item</exception>
|
/// <exception cref="System.ArgumentNullException">item</exception>
|
||||||
public async Task SaveItem(BaseItem item, CancellationToken cancellationToken)
|
public Task SaveItem(BaseItem item, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (item == null)
|
if (item == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("item");
|
throw new ArgumentNullException("item");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return SaveItems(new[] { item }, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Saves the items.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="items">The items.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
/// <exception cref="System.ArgumentNullException">
|
||||||
|
/// items
|
||||||
|
/// or
|
||||||
|
/// cancellationToken
|
||||||
|
/// </exception>
|
||||||
|
public async Task SaveItems(IEnumerable<BaseItem> items, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
if (items == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("items");
|
||||||
|
}
|
||||||
|
|
||||||
if (cancellationToken == null)
|
if (cancellationToken == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("cancellationToken");
|
throw new ArgumentNullException("cancellationToken");
|
||||||
@ -186,8 +207,6 @@ namespace MediaBrowser.Server.Implementations.Sqlite
|
|||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
var serialized = _jsonSerializer.SerializeToBytes(item);
|
|
||||||
|
|
||||||
await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false);
|
await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
SQLiteTransaction transaction = null;
|
SQLiteTransaction transaction = null;
|
||||||
@ -196,13 +215,18 @@ namespace MediaBrowser.Server.Implementations.Sqlite
|
|||||||
{
|
{
|
||||||
transaction = Connection.BeginTransaction();
|
transaction = Connection.BeginTransaction();
|
||||||
|
|
||||||
|
foreach (var item in items)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
_saveItemCommand.Parameters[0].Value = item.Id;
|
_saveItemCommand.Parameters[0].Value = item.Id;
|
||||||
_saveItemCommand.Parameters[1].Value = item.GetType().FullName;
|
_saveItemCommand.Parameters[1].Value = item.GetType().FullName;
|
||||||
_saveItemCommand.Parameters[2].Value = serialized;
|
_saveItemCommand.Parameters[2].Value = _jsonSerializer.SerializeToBytes(item);
|
||||||
|
|
||||||
_saveItemCommand.Transaction = transaction;
|
_saveItemCommand.Transaction = transaction;
|
||||||
|
|
||||||
await _saveItemCommand.ExecuteNonQueryAsync(cancellationToken);
|
await _saveItemCommand.ExecuteNonQueryAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
transaction.Commit();
|
transaction.Commit();
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Data.Common;
|
using System.Data.Common;
|
||||||
using System.Data.SQLite;
|
using System.Data.SQLite;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.Sqlite
|
namespace MediaBrowser.Server.Implementations.Sqlite
|
||||||
|
Loading…
x
Reference in New Issue
Block a user