From 38e73a9d9df109528e62f1d7ec42548761a7bd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Thu, 8 Mar 2018 23:11:15 +0100 Subject: [PATCH 1/3] Provide MySql driver default batcher. --- src/NHibernate/Driver/MySqlDataDriver.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NHibernate/Driver/MySqlDataDriver.cs b/src/NHibernate/Driver/MySqlDataDriver.cs index 83e9702cfef..57e80fe0d90 100644 --- a/src/NHibernate/Driver/MySqlDataDriver.cs +++ b/src/NHibernate/Driver/MySqlDataDriver.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.AdoNet; namespace NHibernate.Driver { @@ -16,7 +17,7 @@ namespace NHibernate.Driver /// for any updates and/or documentation regarding MySQL. /// /// - public class MySqlDataDriver : ReflectionBasedDriver + public class MySqlDataDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider { /// /// Initializes a new instance of the class. @@ -95,5 +96,7 @@ public override bool SupportsMultipleQueries // https://dev.mysql.com/doc/refman/5.7/en/datetime.html /// public override DateTime MinDate => new DateTime(1000, 1, 1); + + System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass => typeof(MySqlClientBatchingBatcherFactory); } } From 2965228c2ee8aff9112586a633b2c72f0eb7e885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Fri, 9 Mar 2018 14:09:13 +0100 Subject: [PATCH 2/3] Cease encapsulating exceptions in MySql batcher, it prevents exception translation. Fixes #1604 --- .../AdoNet/MySqlClientSqlCommandSet.cs | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/NHibernate/AdoNet/MySqlClientSqlCommandSet.cs b/src/NHibernate/AdoNet/MySqlClientSqlCommandSet.cs index af87b6aae5c..f4ebd0640e5 100644 --- a/src/NHibernate/AdoNet/MySqlClientSqlCommandSet.cs +++ b/src/NHibernate/AdoNet/MySqlClientSqlCommandSet.cs @@ -51,19 +51,12 @@ public void Dispose() public int ExecuteNonQuery() { - try + if (CountOfCommands == 0) { - if (CountOfCommands == 0) - { - return 0; - } - - return doExecuteNonQuery(instance); - } - catch (Exception exception) - { - throw new HibernateException("An exception occured when executing batch queries", exception); + return 0; } + + return doExecuteNonQuery(instance); } public int CountOfCommands @@ -71,4 +64,4 @@ public int CountOfCommands get { return countOfCommands; } } } -} \ No newline at end of file +} From 2099f0b55f97ac4029e55517f029061edb732970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Fri, 9 Mar 2018 15:25:00 +0100 Subject: [PATCH 3/3] Check readers before initiating a new MySql batch. Fixes #1605. --- src/NHibernate/AdoNet/MySqlClientBatchingBatcher.cs | 4 ++++ src/NHibernate/Async/AdoNet/MySqlClientBatchingBatcher.cs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/NHibernate/AdoNet/MySqlClientBatchingBatcher.cs b/src/NHibernate/AdoNet/MySqlClientBatchingBatcher.cs index 3a24de6a914..5801dc461b5 100644 --- a/src/NHibernate/AdoNet/MySqlClientBatchingBatcher.cs +++ b/src/NHibernate/AdoNet/MySqlClientBatchingBatcher.cs @@ -39,6 +39,10 @@ protected override int CountOfStatementsInCurrentBatch public override void AddToBatch(IExpectation expectation) { + // MySql batcher cannot be initiated if a data reader is still open: check them. + if (CountOfStatementsInCurrentBatch == 0) + CheckReaders(); + totalExpectedRowsAffected += expectation.ExpectedRowCount; var batchUpdate = CurrentCommand; Prepare(batchUpdate); diff --git a/src/NHibernate/Async/AdoNet/MySqlClientBatchingBatcher.cs b/src/NHibernate/Async/AdoNet/MySqlClientBatchingBatcher.cs index 048670495b0..c52f94b83dc 100644 --- a/src/NHibernate/Async/AdoNet/MySqlClientBatchingBatcher.cs +++ b/src/NHibernate/Async/AdoNet/MySqlClientBatchingBatcher.cs @@ -24,6 +24,10 @@ public partial class MySqlClientBatchingBatcher : AbstractBatcher public override async Task AddToBatchAsync(IExpectation expectation, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); + // MySql batcher cannot be initiated if a data reader is still open: check them. + if (CountOfStatementsInCurrentBatch == 0) + await (CheckReadersAsync(cancellationToken)).ConfigureAwait(false); + totalExpectedRowsAffected += expectation.ExpectedRowCount; var batchUpdate = CurrentCommand; await (PrepareAsync(batchUpdate, cancellationToken)).ConfigureAwait(false);