Содержание
- Connection closed on command timeout #453
- Comments
- MySql.Data 6.9.11
- MySql.Data 6.10.4 / 8.0.11
- MySqlClient EndOfStreamException: Неустранимая ошибка при попытке чтения за пределами конца потока
Connection closed on command timeout #453
Connector/NET does not close connection when command timeout occurs . Instead, it cancels running query. If I remember correctly, SqlClient would not close a connection either. (Also JDBC drivers from both Oracle and MariaDB would keep the connection open whenever command times out).
Only in MySqlConnector, the command timeout is fatal.
The text was updated successfully, but these errors were encountered:
In MySqlConnector, the command timeout functionality doesn’t cancel a running query but destroys the connection; see discussion at #67 (comment) and #455 (comment).
The workaround is to either call MySqlCommand.Cancel() or use an ExecuteXAsync overload with a timeout-based CancellationToken .
I understand that this is a change from other ADO.NET connectors. I outlined a plan for improving it here: #455 (comment)
Connector/NET does not close connection when command timeout occurs
This appears to have changed in 8.0.11; a timeout exception has now become Fatal error encountered during command execution (inner exception Fatal error encountered attempting to read the resultset ), which closes the connection: dd0b53a#diff-997601572c07dd2ca5e054c35564cf2eL84
I’m not saying that we shouldn’t fix this (because Connector/NET now does the same thing), but just that MySqlConnector’s behaviour may now be less of a breaking change.
Executing SELECT SLEEP(10); with MySqlCommand.CommandTimeout = 1 :
MySql.Data 6.9.11
Afterwards, MySqlConnection.State == ConnectionState.Open .
MySql.Data 6.10.4 / 8.0.11
Afterwards, MySqlConnection.State == ConnectionState.Closed .
Thanks @bgrainger for the info! Btw can we get our old TimeoutException back? I just lost a couple of time here on research until I finally found this topic. I don’t think it’s a problem to get the connection closed, but the exception itself is now misleading.
Btw can we get our old TimeoutException back?
MySqlConnector (this library) has never thrown a TimeoutException .
If you’re referring to changes in Connector/NET (MySql.Data), that library is owned by Oracle and you need to report bugs/feature requests at https://bugs.mysql.com/.
We had a similar issue.
We experienced timeouts on some queries, when the timeout occurred, the queries would just keep running on MySQL although on the backend we would have an exception.
Users would then retry the operation , which made things worse.
We are not using async on our server, so using cancellation token wasn’t an option for us,
So we created a «wrapper» connection object that executes the operation on the database, but before that it grabs the process id so we can kill it in case things go wrong, like a timeout.
Something like this (this code is incomplete):
Источник
MySqlClient EndOfStreamException: Неустранимая ошибка при попытке чтения за пределами конца потока
Я разработал службу Windows для чтения данных из CSV и записи их обратно в базу данных.
После выполнения программы она будет работать нормально до тех пор, пока через несколько минут не сработает ошибка при достижении строки ниже.
Данные были записаны в базу данных до появления этой ошибки.
Возникновение ошибки может занять до 2–3 минут.
Я включу соответствующий фрагмент кода для этой проблемы.
Чтобы было понятнее, я также приложу снимок экрана с файлом csv и структурой db.
В середине строк в csv есть пробелы, поэтому я пропустил строки 6 и 8 в исходном коде.
снимок экрана таблицы базы данных phpMyAdmin
Измените свой вопрос, включив в него полные сведения об исключении, включая стеки вызовов и все внутренние исключения: idownvotedbecau.se/noexceptiondetails (не голосовал против)
@ Брэдли Грейнджер Спасибо, что указали на слабость моего вопроса. Я отредактировал свой вопрос с описательным контекстом исключения MySql.
Это ошибка очень часто сообщается в MySQL Connector / NET.
Лучшее решение, которое я обнаружил в сообществе, было отправленный Rui Fan:
I’ve identified the root cause of one case of this exception. If you always see this exception at the first connection to the database, my solutions may apply to you. The 3 possible solutions:
Solution 1: If SSL is not required. Since it is caused by SSL, we can turn off SSL by appending «SslMode=None» to the connection string.
Solution 2: If SSL is required, server identity is important and needs to be verified. Connect the server to the internet and try again.
Solution 3: If SSL is required but the server identity is not important. Typically SSL is only used to encrypt the network transport in this case. We can turn off CTL update:
- Press Win+R to open the «Run» dialog
- Type gpedit.msc and press Enter
- In the «Local Group Policy Editor», expand «Computer Configuration», expand «Administrative Templates», expand «System», expand «Internet Communication Management», and then click «Internet Communication settings».
- In the details panel, double-click «Turn off Automatic Root Certificates Update», clickEnabled, then click OK. This change will be effective immediatelly without restart.
More details can be found in my blog.
Источник
Connection state is now 'Open' (Q to quit, any other key to continue)
SUCCESS: SELECT 1 was successful
Connection state is now 'Open' (Q to quit, any other key to continue)
FAILURE: MySql.Data.MySqlClient.MySqlException (0x80004005): Failed to read the result set. ---> System.Net.Sockets.SocketException (0x80004005): An established connection was aborted by the software in your host machine
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at MySqlConnector.Protocol.Serialization.SocketByteHandler.<ReadBytesAsync>g__DoReadBytesSync|6_0(ArraySegment`1 buffer_)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable`1.ConfiguredValueTaskAwaiter.GetResult()
at MySqlConnector.Protocol.Serialization.BufferedByteReader.<ReadBytesAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Threading.Tasks.ValueTask`1.get_Result()
at MySqlConnector.Protocol.Serialization.ProtocolUtility.ReadPacketAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior)
at MySqlConnector.Protocol.Serialization.ProtocolUtility.DoReadPayloadAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ArraySegmentHolder`1 previousPayloads, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior)
at MySqlConnector.Protocol.Serialization.StandardPayloadHandler.ReadPayloadAsync(ArraySegmentHolder`1 cache, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior)
at MySqlConnector.Core.ServerSession.ReceiveReplyAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MySqlConnector.Core.ServerSession.TryAsyncContinuation(Task`1 task)
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable`1.ConfiguredValueTaskAwaiter.GetResult()
at MySqlConnector.Core.ResultSet.<ReadResultSetHeaderAsync>d__1.MoveNext()
at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet)
at MySql.Data.MySqlClient.MySqlDataReader.<ReadFirstResultSetAsync>d__96.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MySql.Data.MySqlClient.MySqlDataReader.<CreateAsync>d__95.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MySqlConnector.Core.TextCommandExecutor.<ExecuteReaderAsync>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MySql.Data.MySqlClient.MySqlCommand.<ExecuteScalarAsync>d__63.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteScalar()
at MySqlConnectorTestApp.Program.Main(String[] args) in C:DevelopmentSandboxMySqlConnectorTestAppMySqlConnectorTestAppProgram.cs:line 38
Connection state is now 'Open' (Q to quit, any other key to continue)
FAILURE: System.InvalidOperationException: Expected state to be Connected but was Failed.
at MySqlConnector.Core.ServerSession.VerifyState(State state)
at MySqlConnector.Core.ServerSession.StartQuerying(MySqlCommand command)
at MySqlConnector.Core.TextCommandExecutor.<ExecuteReaderAsync>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MySql.Data.MySqlClient.MySqlCommand.<ExecuteScalarAsync>d__63.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteScalar()
at MySqlConnectorTestApp.Program.Main(String[] args) in C:DevelopmentSandboxMySqlConnectorTestAppMySqlConnectorTestAppProgram.cs:line 38
Connection state is now 'Open' (Q to quit, any other key to continue)
|
147 / 115 / 10 Регистрация: 12.09.2011 Сообщений: 785 |
|
|
1 |
|
|
11.05.2018, 16:20. Показов 4849. Ответов 13
Привет всем! Моя программа работает с удаленной базой MySQL. Всё работает чудно, но после нескольких минут простоя программы (производится только обновление таблиц с сервера с интервалом в 5 секунд) при записи новой строки в таблицу MySQL выдает ошибку «Fatal error encountered during command execution«. Подскажите, пожалуйста, от чего это может случаться и как это исправить? Спасибо!
0 |
|
Администратор 15248 / 12287 / 4904 Регистрация: 17.03.2014 Сообщений: 24,885 Записей в блоге: 1 |
|
|
11.05.2018, 18:08 |
2 |
|
Vinemax, полный текст исключения смотрел? С соединением как работа идет — открывается каждый раз новое или все время одно?
2 |
|
Vinemax 147 / 115 / 10 Регистрация: 12.09.2011 Сообщений: 785 |
||||
|
11.05.2018, 18:23 [ТС] |
3 |
|||
|
OwenGlendower, всё время одно. Текст исключения весь не видел, бо у меня обработчик ошибок стоит. Я тут нагуглил, что есть такое свойство, как CommanTimeout, которое по умолчанию установлено в 30 (видимо, секунд). Устанавливаю его целенаправленно в 3600 и вот сейчас проверил и опять эта же ошибка после некоторого простоя. Код операции добавления строки в таблицу на VB у меня такой:
…подключение connection всё время открыто, но вот command у меня локальная в процедуре. Может быть её сделать глобальной для всего класса и сразу установить ей глобально CommandTimeout ?
0 |
|
Администратор 15248 / 12287 / 4904 Регистрация: 17.03.2014 Сообщений: 24,885 Записей в блоге: 1 |
|
|
11.05.2018, 18:27 |
4 |
|
Текст исключения весь не видел, бо у меня обработчик ошибок стоит. Не вижу тут связи. Прежде чем что-то делать нужно точно знать что происходит. Получи полный текст исключения прежде чем двигаться дальше.
Может быть её сделать глобальной для всего класса и сразу установить ей глобально CommandTimeout ? Не надо.
подключение connection всё время открыто Возможно поможет открытие и закрытие соединение для каждой команды. Создали соединение, открыли, выполнили команду и закрыли соединение.
2 |
|
147 / 115 / 10 Регистрация: 12.09.2011 Сообщений: 785 |
|
|
11.05.2018, 18:43 [ТС] |
5 |
|
Создали соединение, открыли, выполнили команду и закрыли соединение. Видимо, так и сделаю, если иначе не решу вопрос. Сейчас запустил без обработчика ошибок, подожду немного, чтобы увидеть весь текст исключения… Добавлено через 12 минут 1) SocketException: Удаленный хост принудительно разорвал существующее подключение 2) IOException: Не удается прочитать данные из транспортного соединения: Удаленный хост принудительно разорвал существующее подключение. 3) MySqlException: Reading from the stream has failed. 4) MySqlException: Fatal error encountered attempting to read the resultset. Это всё одна ошибка.
0 |
|
Администратор 15248 / 12287 / 4904 Регистрация: 17.03.2014 Сообщений: 24,885 Записей в блоге: 1 |
|
|
11.05.2018, 18:53 |
6 |
|
РешениеVinemax, как и предполагалось виновато соединение которое внезапно оказывается закрытым. Попробуй открывать и закрывать его явно каждый раз.
2 |
|
147 / 115 / 10 Регистрация: 12.09.2011 Сообщений: 785 |
|
|
11.05.2018, 18:55 [ТС] |
7 |
|
Да вот не хотелось бы закрывать и открывать заново, это же всё время, особенно при медленном интернете
0 |
|
Администратор 15248 / 12287 / 4904 Регистрация: 17.03.2014 Сообщений: 24,885 Записей в блоге: 1 |
|
|
11.05.2018, 18:56 |
8 |
|
Vinemax, у соединения две стороны. Одна сторона может закрыть соединение не уведомляя другую. В данном случае так поступает сервер MySql.
2 |
|
147 / 115 / 10 Регистрация: 12.09.2011 Сообщений: 785 |
|
|
11.05.2018, 19:30 [ТС] |
9 |
|
РешениеOwenGlendower, сделал connection.Ping с интервалом в 5 секунд и проблема пропала. Только вот вопрос, а можно ли так часто и много пинговать, админов сайта это не насторожит, не заблокируют?
1 |
|
Администратор 15248 / 12287 / 4904 Регистрация: 17.03.2014 Сообщений: 24,885 Записей в блоге: 1 |
|
|
11.05.2018, 20:05 |
10 |
|
Vinemax, без понятия. Время покажет.
1 |
|
147 / 115 / 10 Регистрация: 12.09.2011 Сообщений: 785 |
|
|
11.05.2018, 20:24 [ТС] |
11 |
|
OwenGlendower, спасибо!
0 |
|
Модератор 3861 / 3184 / 479 Регистрация: 27.01.2014 Сообщений: 5,809 |
|
|
12.05.2018, 04:21 |
12 |
|
Vinemax, а зачем каждые 5 секунд делать пинг, ведь это гораздо дольше чем открывать и закрывать соединение?
1 |
|
147 / 115 / 10 Регистрация: 12.09.2011 Сообщений: 785 |
|
|
13.05.2018, 02:15 [ТС] |
13 |
|
Yury Komar, ну у меня происходит так… В фоновом процессе BackgroundWorker’а каждые пять секунд обновляются все таблицы программы, а точнее измененные строки всех таблиц. При запуске BackgroundWorker’а пятисекундный таймер отключается, а при завершении обновления всех таблиц опять включается, то есть через пять секунд из процедуры Tick таймера BackgroundWorker опять запускается. Ну вот в этот момент перед запуском BackgroundWorker’а я и делаю пинг. И вот практика на примере очень медленного Интернета показала, что пинг происходит очень быстро, а вот новое подключение идет две — три секунды. Дело в том, что MySqlConnection.Ping возвращает только True или False, то есть не дает всей инфы, отчего, видимо, быстро и срабатывает. Здесь получается суть не конкретно в пинге, а в том, чтобы connection хоть чем-то занять, дабы оно не разъединялось.
1 |
|
Модератор 3861 / 3184 / 479 Регистрация: 27.01.2014 Сообщений: 5,809 |
|
|
13.05.2018, 02:42 |
14 |
|
Vinemax, понятно. Ну надеюсь будет работать без сюрпризов.
1 |
I want to insert data in a database table from two other tables
Whenever I run my code, it would return this particular error
An unhandled exception of type ‘MySql.Data.MySqlClient.MySqlException’ occurred in MySql.Data.dll — Additional information: Fatal error encountered during command execution.
which is pointed at
cmd.ExecuteNonQuery();
What could be the problem here? Here’s my code
private void Merge_Tables_Click(object sender, EventArgs e)
{
string MergeTables = (@"INSERT INTO exercices (annee,AA,region)
SELECT e1.annee,e1.AA,e2.region
FROM bilan e1 JOIN data e2
ON e1.siren = e2.siren");
string serverIp = "127.0.0.1";
string username = "root";
string password = "root";
string databaseName = "altares";
string dbConnectionString =
string.Format("server={0};uid={1};pwd={2};database={3};SslMode=none",
serverIp, username, password, databaseName);
var conn = new MySqlConnection(dbConnectionString);
conn.Open();
var cmd = new MySqlCommand(MergeTables, conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Table exercices now with data !!");
}
EXPLAN SELECT Results :
Exception Details :
MySql.Data.MySqlClient.MySqlException was unhandled
Code=0
ErrorCode=-2147467259
HResult=-2147467259
Message=Fatal error encountered during command execution.
Number=0
Source=MySql.Data
StackTrace:
à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
à MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
à update_excel.Form1.Merge_Tables_Click(Object sender, EventArgs e) dans C:UsersBALTIDocumentsVisual Studio 2015Projectsupdate-excelupdate-excelForm1.cs:ligne 442
à System.Windows.Forms.Control.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ButtonBase.WndProc(Message& m)
à System.Windows.Forms.Button.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
à System.Windows.Forms.Application.Run(Form mainForm)
à update_excel.Program.Main() dans C:UsersBALTIDocumentsVisual Studio 2015Projectsupdate-excelupdate-excelProgram.cs:ligne 19
à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
à System.Threading.ThreadHelper.ThreadStart()
InnerException:
Code=0
ErrorCode=-2147467259
HResult=-2147467259
Message=Fatal error encountered attempting to read the resultset.
Number=0
Source=MySql.Data
StackTrace:
à MySql.Data.MySqlClient.MySqlDataReader.NextResult()
à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
InnerException:
Code=0
ErrorCode=-2147467259
HResult=-2147467259
Message=Reading from the stream has failed.
Number=0
Source=MySql.Data
StackTrace:
à MySql.Data.MySqlClient.MySqlStream.LoadPacket()
à MySql.Data.MySqlClient.MySqlStream.ReadPacket()
à MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
à MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId)
à MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
à MySql.Data.MySqlClient.MySqlDataReader.NextResult()
InnerException:
HResult=-2146232800
Message=Impossible de lire les données de la connexion de transport : Une tentative de connexion a échoué car le parti connecté n’a pas répondu convenablement au-delà d’une certaine durée ou une connexion établie a échoué car l’hôte de connexion n’a pas répondu.
Source=System
StackTrace:
à System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
à MySql.Data.MySqlClient.TimedStream.Read(Byte[] buffer, Int32 offset, Int32 count)
à MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
à MySql.Data.MySqlClient.MySqlStream.LoadPacket()
InnerException:
ErrorCode=10060
HResult=-2147467259
Message=Une tentative de connexion a échoué car le parti connecté n’a pas répondu convenablement au-delà d’une certaine durée ou une connexion établie a échoué car l’hôte de connexion n’a pas répondu
NativeErrorCode=10060
Source=System
StackTrace:
à System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
à System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
InnerException:











Сообщение было отмечено Yury Komar как решение