Removes the useNativeBulkInsert parameter, it's super old and useless

This commit is contained in:
Shannon
2019-12-19 17:56:48 +11:00
parent aae5fc0048
commit a8f006e36e
9 changed files with 11 additions and 281 deletions

View File

@@ -9,7 +9,7 @@ namespace Umbraco.Core.Persistence
{
public class SqlCeBulkSqlInsertProvider : IBulkSqlInsertProvider
{
public int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records, bool useNativeBulkInsert)
public int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> 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);
}
/// <summary>

View File

@@ -4,6 +4,6 @@ namespace Umbraco.Core.Persistence
{
public interface IBulkSqlInsertProvider
{
int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records, bool useNativeBulkInsert);
int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records);
}
}

View File

@@ -24,6 +24,6 @@ namespace Umbraco.Core.Persistence
bool EnableSqlCount { get; set; }
int SqlCount { get; }
int BulkInsertRecords<T>(IEnumerable<T> records, bool useNativeBulkInsert = true);
int BulkInsertRecords<T>(IEnumerable<T> records);
}
}

View File

@@ -10,7 +10,7 @@ namespace Umbraco.Core.Persistence
{
public class SqlServerBulkSqlInsertProvider : IBulkSqlInsertProvider
{
public int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records, bool useNativeBulkInsert)
public int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> 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();
}
/// <summary>

View File

@@ -162,9 +162,9 @@ namespace Umbraco.Core.Persistence
/// </summary>
public int SqlCount { get; private set; }
public int BulkInsertRecords<T>(IEnumerable<T> records, bool useNativeBulkInsert = true)
public int BulkInsertRecords<T>(IEnumerable<T> records)
{
return _bulkSqlInsertProvider.BulkInsertRecords(this, records, useNativeBulkInsert);
return _bulkSqlInsertProvider.BulkInsertRecords(this, records);
}

View File

@@ -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<IScopeProvider>(() => f);
var factory = new UmbracoDatabaseFactory(
"server=.\\SQLExpress;database=YOURDB;user id=YOURUSER;password=YOURPASS",
Constants.DatabaseProviders.SqlServer,
logger,
new Lazy<IMapperCollection>(() => new MapperCollection(Enumerable.Empty<BaseMapper>())),
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<IMapperCollection>(() => new MapperCollection(Enumerable.Empty<BaseMapper>())),
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<ServerRegistrationDto> GetData()
{
var data = new List<ServerRegistrationDto>();
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;
/// <summary>
/// Tests updating the existing XML way
/// </summary>
[Benchmark(Baseline = true)]
public void SqlCeOneByOne()
{
using (var tr = _dbSqlCe.GetTransaction())
{
_dbSqlCe.BulkInsertRecords(GetData(), false);
tr.Complete();
}
}
/// <summary>
/// Tests updating with only the object graph
/// </summary>
[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();
}
}
}
}

View File

@@ -45,7 +45,6 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="BulkInsertBenchmarks.cs" />
<Compile Include="CombineGuidBenchmarks.cs" />
<Compile Include="ConcurrentDictionaryBenchmarks.cs" />
<Compile Include="Config\QuickRunConfigAttribute.cs" />

View File

@@ -18,71 +18,6 @@ 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<ServerRegistrationDto>();
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<NPocoBulkInsertTests>("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<int>("SELECT COUNT(*) FROM umbracoServer"), Is.EqualTo(1000));
}
}
[Test]
public void Can_Bulk_Insert_One_By_One_Transaction_Rollback()
{
var servers = new List<ServerRegistrationDto>();
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<NPocoBulkInsertTests>("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<int>("SELECT COUNT(*) FROM umbracoServer"), Is.EqualTo(0));
}
}
[NUnit.Framework.Ignore("Ignored because you need to configure your own SQL Server to test thsi with")]

View File

@@ -107,7 +107,7 @@ namespace Umbraco.Tests.Testing
public bool InTransaction { get; }
public bool EnableSqlCount { get; set; }
public int SqlCount { get; }
public int BulkInsertRecords<T>(IEnumerable<T> records, bool useNativeBulkInsert = true) => throw new NotImplementedException();
public int BulkInsertRecords<T>(IEnumerable<T> records) => throw new NotImplementedException();
public DbParameter CreateParameter()
{