这个问题已经在我们的生产上很久了。
有成千上万的用户的机器一直试图同时连接到MySQL,并通过不断根据需要更改数据库来对多个数据库进行查询。
要更改数据库,这是客户机所具有的-
private MySqlConnection Conn;
public void ChangeDatabase(string DatabaseName)
{
if (Conn.State != ConnectionState.Open)
{
Conn.Open();
}
Conn.ChangeDatabase(DatabaseName);
}
根据我们的猜测,在某些情况下,当数据库发生更改时,我们会得到-
[捕获到的标准异常:MySql.Data.MySqlClient.MySql Exception]对用户的主机'.'.'.'.'.'.'.'.'.'-'使用方法'MySql'.native'.password'的身份验证失败,并显示消息:读取流失败。
这是堆栈跟踪-
Void Trace(System.Exception) [FileName: ; Line:0].
Void TimerProcess_Elapsed(System.Object, System.Timers.ElapsedEventArgs) [FileName: ; Line:0].
Void MyTimerCallback(System.Object) [FileName: ; Line:0].
Void CallCallbackInContext(System.Object) [FileName: ; Line:0].
Void RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
Void CallCallback() [FileName: ; Line:0].
Void Fire() [FileName: ; Line:0].
Void FireNextTimers() [FileName: ; Line:0].
Void AppDomainTimerCallback() [FileName: ; Line:0]. at
MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.AuthenticationFailed(Exception ex) at
MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.ReadPacket() at
MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.Authenticate(Boolean reset) at
MySql.Data.MySqlClient.NativeDriver.Authenticate(String authMethod, Boolean reset) at
MySql.Data.MySqlClient.NativeDriver.Open() at
MySql.Data.MySqlClient.Driver.Open() at
MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) at
MySql.Data.MySqlClient.MySqlConnection.Open() at
FSCCClientUploadServiceLive.ProcessClientUpload.TimerProcess_Elapsed(Object sender, ElapsedEventArgs e)
----------------------------------------------------------
Time stamp 18/09/2018 12:25:48.325
Thread details 27
Message: [InnerException] Reading from the stream has failed.
Detail: [Source] MySql.Data
Stack Trace:
Void Trace(System.Exception) [FileName: ; Line:0].
Void TimerFinish_Elapsed(System.Object, System.Timers.ElapsedEventArgs) [FileName: ; Line:0].
Void MyTimerCallback(System.Object) [FileName: ; Line:0].
Void CallCallbackInContext(System.Object) [FileName: ; Line:0].
Void RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
Void CallCallback() [FileName: ; Line:0].
Void Fire() [FileName: ; Line:0].
Void FireNextTimers() [FileName: ; Line:0].
Void AppDomainTimerCallback() [FileName: ; Line:0].
at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.ReadPacket()
----------------------------------------------------------
Time stamp 18/09/2018 12:25:49.093
Thread details 27
Message: [InnerException] Attempted to read past the end of the stream.
Detail: [Source] MySql.Data
Stack Trace:
Void Trace(System.Exception) [FileName: ; Line:0].
Void TimerFinish_Elapsed(System.Object, System.Timers.ElapsedEventArgs) [FileName: ; Line:0].
Void MyTimerCallback(System.Object) [FileName: ; Line:0].
Void CallCallbackInContext(System.Object) [FileName: ; Line:0].
Void RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
Void CallCallback() [FileName: ; Line:0].
Void Fire() [FileName: ; Line:0].
Void FireNextTimers() [FileName: ; Line:0].
Void AppDomainTimerCallback() [FileName: ; Line:0].
at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
这个问题不是经常出现的。一切正常时,突然不知从哪里冒出来。