From a8f006e36e158690c8364b9e19337260a024ae2c Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 19 Dec 2019 17:56:48 +1100 Subject: [PATCH] Removes the useNativeBulkInsert parameter, it's super old and useless --- .../Persistence/SqlCeBulkSqlInsertProvider.cs | 9 +- .../Persistence/IBulkSqlInsertProvider.cs | 2 +- .../Persistence/IUmbracoDatabase.cs | 2 +- .../SqlServerBulkSqlInsertProvider.cs | 5 +- .../Persistence/UmbracoDatabase.cs | 4 +- .../BulkInsertBenchmarks.cs | 200 ------------------ .../Umbraco.Tests.Benchmarks.csproj | 1 - .../NPocoTests/NPocoBulkInsertTests.cs | 67 +----- src/Umbraco.Tests/Testing/TestDatabase.cs | 2 +- 9 files changed, 11 insertions(+), 281 deletions(-) delete mode 100644 src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs diff --git a/src/Umbraco.Core/Persistence/SqlCeBulkSqlInsertProvider.cs b/src/Umbraco.Core/Persistence/SqlCeBulkSqlInsertProvider.cs index 988b1696dc..e7c38ef5db 100644 --- a/src/Umbraco.Core/Persistence/SqlCeBulkSqlInsertProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlCeBulkSqlInsertProvider.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Persistence { public class SqlCeBulkSqlInsertProvider : IBulkSqlInsertProvider { - public int BulkInsertRecords(IUmbracoDatabase database, IEnumerable records, bool useNativeBulkInsert) + public int BulkInsertRecords(IUmbracoDatabase database, IEnumerable records) { var recordsA = records.ToArray(); if (recordsA.Length == 0) return 0; @@ -17,11 +17,8 @@ namespace Umbraco.Core.Persistence var pocoData = database.PocoDataFactory.ForType(typeof(T)); if (pocoData == null) throw new InvalidOperationException("Could not find PocoData for " + typeof(T)); - if (useNativeBulkInsert) return BulkInsertRecordsSqlCe(database, pocoData, recordsA); - // else, no other choice - foreach (var record in recordsA) - database.Insert(record); - return recordsA.Length; + return BulkInsertRecordsSqlCe(database, pocoData, recordsA); + } /// diff --git a/src/Umbraco.Infrastructure/Persistence/IBulkSqlInsertProvider.cs b/src/Umbraco.Infrastructure/Persistence/IBulkSqlInsertProvider.cs index b4d4a021c2..e41367288b 100644 --- a/src/Umbraco.Infrastructure/Persistence/IBulkSqlInsertProvider.cs +++ b/src/Umbraco.Infrastructure/Persistence/IBulkSqlInsertProvider.cs @@ -4,6 +4,6 @@ namespace Umbraco.Core.Persistence { public interface IBulkSqlInsertProvider { - int BulkInsertRecords(IUmbracoDatabase database, IEnumerable records, bool useNativeBulkInsert); + int BulkInsertRecords(IUmbracoDatabase database, IEnumerable records); } } diff --git a/src/Umbraco.Infrastructure/Persistence/IUmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/IUmbracoDatabase.cs index 699c12ee2d..1b0d1d9c2b 100644 --- a/src/Umbraco.Infrastructure/Persistence/IUmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/IUmbracoDatabase.cs @@ -24,6 +24,6 @@ namespace Umbraco.Core.Persistence bool EnableSqlCount { get; set; } int SqlCount { get; } - int BulkInsertRecords(IEnumerable records, bool useNativeBulkInsert = true); + int BulkInsertRecords(IEnumerable records); } } diff --git a/src/Umbraco.Infrastructure/Persistence/SqlServerBulkSqlInsertProvider.cs b/src/Umbraco.Infrastructure/Persistence/SqlServerBulkSqlInsertProvider.cs index 71c50fdcce..68e7f7acdc 100644 --- a/src/Umbraco.Infrastructure/Persistence/SqlServerBulkSqlInsertProvider.cs +++ b/src/Umbraco.Infrastructure/Persistence/SqlServerBulkSqlInsertProvider.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Persistence { public class SqlServerBulkSqlInsertProvider : IBulkSqlInsertProvider { - public int BulkInsertRecords(IUmbracoDatabase database, IEnumerable records, bool useNativeBulkInsert) + public int BulkInsertRecords(IUmbracoDatabase database, IEnumerable records) { var recordsA = records.ToArray(); if (recordsA.Length == 0) return 0; @@ -18,10 +18,9 @@ namespace Umbraco.Core.Persistence var pocoData = database.PocoDataFactory.ForType(typeof(T)); if (pocoData == null) throw new InvalidOperationException("Could not find PocoData for " + typeof(T)); - return useNativeBulkInsert && database.DatabaseType.IsSqlServer2008OrLater() + return database.DatabaseType.IsSqlServer2008OrLater() ? BulkInsertRecordsSqlServer(database, pocoData, recordsA) : BulkInsertRecordsWithCommands(database, recordsA); - throw new NotSupportedException(); } /// diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs index 568a1d22d1..ea3d603f95 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs @@ -162,9 +162,9 @@ namespace Umbraco.Core.Persistence /// public int SqlCount { get; private set; } - public int BulkInsertRecords(IEnumerable records, bool useNativeBulkInsert = true) + public int BulkInsertRecords(IEnumerable records) { - return _bulkSqlInsertProvider.BulkInsertRecords(this, records, useNativeBulkInsert); + return _bulkSqlInsertProvider.BulkInsertRecords(this, records); } diff --git a/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs b/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs deleted file mode 100644 index 775bec75f0..0000000000 --- a/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data.SqlServerCe; -using System.IO; -using System.Linq; -using BenchmarkDotNet.Attributes; -using Umbraco.Core; -using Umbraco.Core.Configuration; -using Umbraco.Core.Logging; -using Umbraco.Core.Migrations.Install; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.Dtos; -using Umbraco.Core.Persistence.Mappers; -using Umbraco.Core.Scoping; -using Umbraco.Tests.Benchmarks.Config; -using Umbraco.Tests.TestHelpers; -using ILogger = Umbraco.Core.Logging.ILogger; - -namespace Umbraco.Tests.Benchmarks -{ - [QuickRunWithMemoryDiagnoserConfig] - public class BulkInsertBenchmarks - { - private static byte[] _initDbBytes; - - // FIXME: should run on LocalDb same as NPoco tests! - - private IUmbracoDatabase GetSqlServerDatabase(ILogger logger) - { - IScopeProvider f = null; - var l = new Lazy(() => f); - var factory = new UmbracoDatabaseFactory( - "server=.\\SQLExpress;database=YOURDB;user id=YOURUSER;password=YOURPASS", - Constants.DatabaseProviders.SqlServer, - logger, - new Lazy(() => new MapperCollection(Enumerable.Empty())), - TestHelper.DbProviderFactoryCreator, - TestHelper.BulkSqlInsertProvider); - return factory.CreateDatabase(); - } - - private IUmbracoDatabase GetSqlCeDatabase(string cstr, ILogger logger) - { - var f = new UmbracoDatabaseFactory( - cstr, - Constants.DatabaseProviders.SqlCe, - logger, - new Lazy(() => new MapperCollection(Enumerable.Empty())), - TestHelper.DbProviderFactoryCreator, - TestHelper.BulkSqlInsertProvider); - return f.CreateDatabase(); - } - - [GlobalSetup] - public void Setup() - { - var logger = new DebugDiagnosticsLogger(new MessageTemplates()); - var path = TestHelper.CurrentAssemblyDirectory; - var umbracoVersion = TestHelper.GetUmbracoVersion(); - SetupSqlCe(path, logger, umbracoVersion); - SetupSqlServer(logger); - - - } - - private void SetupSqlServer(ILogger logger) - { - //create the db - _dbSqlServer = GetSqlServerDatabase(logger); - - //drop the table - // note: DROP TABLE IF EXISTS is SQL 2016+ - _dbSqlServer.Execute("IF OBJECT_ID('dbo.umbracoServer', 'U') IS NOT NULL DROP TABLE [umbracoServer]"); - - //re-create it - _dbSqlServer.Execute(@"CREATE TABLE [umbracoServer]( - [id] [int] IDENTITY(1,1) NOT NULL, - [address] [nvarchar](500) NOT NULL, - [computerName] [nvarchar](255) NOT NULL, - [registeredDate] [datetime] NOT NULL CONSTRAINT [DF_umbracoServer_registeredDate] DEFAULT (getdate()), - [lastNotifiedDate] [datetime] NOT NULL, - [isActive] [bit] NOT NULL, - [isMaster] [bit] NOT NULL, - CONSTRAINT [PK_umbracoServer] PRIMARY KEY CLUSTERED -( - [id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -)"); - } - - private void SetupSqlCe(string path, ILogger logger, IUmbracoVersion umbracoVersion) - { - var dbName = string.Concat("Umb", Guid.NewGuid(), ".sdf"); - AppDomain.CurrentDomain.SetData("DataDirectory", path); - var sqlCeConnectionString = $"Datasource=|DataDirectory|\\{dbName};Flush Interval=1;"; - - _dbFile = Path.Combine(path, dbName); - - //only create the db one time - if (_initDbBytes == null) - { - using (var engine = new SqlCeEngine(sqlCeConnectionString)) - { - engine.CreateDatabase(); - } - - //use the db to create the initial schema so we can reuse in each bench - using (_dbSqlCe = GetSqlCeDatabase(sqlCeConnectionString, logger)) - { - var creation = new DatabaseSchemaCreator(_dbSqlCe, logger, umbracoVersion); - creation.InitializeDatabaseSchema(); - } - _initDbBytes = File.ReadAllBytes(_dbFile); - } - else - { - File.WriteAllBytes(_dbFile, _initDbBytes); - } - - //create the db - _dbSqlCe = GetSqlCeDatabase(sqlCeConnectionString, logger); - } - - private List GetData() - { - var data = new List(); - for (var i = 0; i < 1000; i++) - { - data.Add(new ServerRegistrationDto - { - ServerAddress = "address" + Guid.NewGuid(), - ServerIdentity = "computer" + Guid.NewGuid(), - DateRegistered = DateTime.Now, - IsActive = true, - DateAccessed = DateTime.Now - }); - } - return data; - } - - [GlobalCleanup] - public void Cleanup() - { - _dbSqlCe.Dispose(); - _dbSqlServer.Dispose(); - File.Delete(_dbFile); - } - - private string _dbFile; - private IUmbracoDatabase _dbSqlCe; - private IUmbracoDatabase _dbSqlServer; - - /// - /// Tests updating the existing XML way - /// - [Benchmark(Baseline = true)] - public void SqlCeOneByOne() - { - using (var tr = _dbSqlCe.GetTransaction()) - { - _dbSqlCe.BulkInsertRecords(GetData(), false); - tr.Complete(); - } - } - - /// - /// Tests updating with only the object graph - /// - [Benchmark] - public void SqlCeTableDirect() - { - using (var tr = _dbSqlCe.GetTransaction()) - { - _dbSqlCe.BulkInsertRecords(GetData()); - tr.Complete(); - } - } - - [Benchmark] - public void SqlServerBulkInsertStatements() - { - using (var tr = _dbSqlServer.GetTransaction()) - { - _dbSqlServer.BulkInsertRecords(GetData(), false); - tr.Complete(); - } - } - - [Benchmark] - public void SqlServerBulkCopy() - { - using (var tr = _dbSqlServer.GetTransaction()) - { - _dbSqlServer.BulkInsertRecords(GetData()); - tr.Complete(); - } - } - - } -} diff --git a/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj b/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj index 97a2ef35ba..45026b974f 100644 --- a/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj +++ b/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj @@ -45,7 +45,6 @@ - diff --git a/src/Umbraco.Tests/Persistence/NPocoTests/NPocoBulkInsertTests.cs b/src/Umbraco.Tests/Persistence/NPocoTests/NPocoBulkInsertTests.cs index 85b07d4828..6c4a23fa00 100644 --- a/src/Umbraco.Tests/Persistence/NPocoTests/NPocoBulkInsertTests.cs +++ b/src/Umbraco.Tests/Persistence/NPocoTests/NPocoBulkInsertTests.cs @@ -18,72 +18,7 @@ namespace Umbraco.Tests.Persistence.NPocoTests [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] public class NPocoBulkInsertTests : TestWithDatabaseBase { - [Test] - public void Can_Bulk_Insert_One_By_One() - { - var servers = new List(); - for (var i = 0; i < 1000; i++) - { - servers.Add(new ServerRegistrationDto - { - ServerAddress = "address" + i, - ServerIdentity = "computer" + i, - DateRegistered = DateTime.Now, - IsActive = true, - DateAccessed = DateTime.Now - }); - } - - // Act - using (ProfilingLogger.TraceDuration("starting insert", "finished insert")) - { - using (var scope = ScopeProvider.CreateScope()) - { - scope.Database.BulkInsertRecords(servers, false); - scope.Complete(); - } - } - - // Assert - using (var scope = ScopeProvider.CreateScope()) - { - Assert.That(scope.Database.ExecuteScalar("SELECT COUNT(*) FROM umbracoServer"), Is.EqualTo(1000)); - } - } - - [Test] - public void Can_Bulk_Insert_One_By_One_Transaction_Rollback() - { - var servers = new List(); - for (var i = 0; i < 1000; i++) - { - servers.Add(new ServerRegistrationDto - { - ServerAddress = "address" + i, - ServerIdentity = "computer" + i, - DateRegistered = DateTime.Now, - IsActive = true, - DateAccessed = DateTime.Now - }); - } - - // Act - using (ProfilingLogger.TraceDuration("starting insert", "finished insert")) - { - using (var scope = ScopeProvider.CreateScope()) - { - scope.Database.BulkInsertRecords(servers, false); - //don't call complete here - the trans will be rolled back - } - } - - // Assert - using (var scope = ScopeProvider.CreateScope()) - { - Assert.That(scope.Database.ExecuteScalar("SELECT COUNT(*) FROM umbracoServer"), Is.EqualTo(0)); - } - } - + [NUnit.Framework.Ignore("Ignored because you need to configure your own SQL Server to test thsi with")] [Test] diff --git a/src/Umbraco.Tests/Testing/TestDatabase.cs b/src/Umbraco.Tests/Testing/TestDatabase.cs index ff24e3f30a..a5ff9a5c05 100644 --- a/src/Umbraco.Tests/Testing/TestDatabase.cs +++ b/src/Umbraco.Tests/Testing/TestDatabase.cs @@ -107,7 +107,7 @@ namespace Umbraco.Tests.Testing public bool InTransaction { get; } public bool EnableSqlCount { get; set; } public int SqlCount { get; } - public int BulkInsertRecords(IEnumerable records, bool useNativeBulkInsert = true) => throw new NotImplementedException(); + public int BulkInsertRecords(IEnumerable records) => throw new NotImplementedException(); public DbParameter CreateParameter() {