这个问题在我们的生产上已经有很长时间了。成千上万的用户同时尝试连接mysql,并根据需要不断修改数据库,从而在多个数据库上进行查询。
要更改数据库,这就是客户机的功能-
private MySqlConnection Conn;
public void ChangeDatabase(string DatabaseName)
{
if (Conn.State != ConnectionState.Open)
{
Conn.Open();
}
Conn.ChangeDatabase(DatabaseName);
}
根据我们的猜测,在某些情况下,当数据库发生更改时,我们会得到例外-
[捕获到的标准异常:mysql.data.mysqlclient.mysqlexception]对用户'---'使用方法'mysql\u native\u password'的主机'.\u.\u'的身份验证失败,消息为:从流读取失败。
这是堆栈跟踪-
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()
这个问题不是经常出现的。一切正常的时候,它突然突然冒了出来。
我已经尝试了其他的解决方案,所以对这个,但没有一个是帮助我们。正如我所猜测的,这个异常主要出现在数据库发生变化的场景中。
2条答案
按热度按时间gopyfrb31#
我读了很多解,最困惑和出现的地方就是这个链接,因为它被引用了很多。https://blog.csdn.net/fancyf/article/details/78295964
但问题很直接,这种联系无法建立。
在我的例子中,当连接到mysql服务器时,local工作得很好。但是当部署到WindowsServer2012 r2时,我得到了一个错误。
在谷歌上搜索一段时间后,解决方案是:
通过将其添加到连接字符串:connection timeout=30来增加连接超时https://www.connectionstrings.com/mysql-connector-net-mysqlconnection/specifying-connection-attempt-timeout/
所以我认为2台服务器需要时间来协商和握手,所以默认的时间框架是不够的。
eufgjt7s2#
解决方案1:如果不需要ssl。因为它是由ssl引起的,所以我们可以通过在连接字符串中附加“sslmode=none”来关闭ssl。
解决方案2:如果需要ssl,那么服务器标识很重要,需要验证。服务器需要internet连接才能进行证书验证。请注意,crypto api并不是每个进程都更新ctl。ctl保持在操作系统级别。一旦您将服务器连接到internet并与服务器建立ssl数据库连接,ctl将自动更新。然后你可以断开互联网连接。请再次注意,ctl有其到期日期,之后windows需要再次更新它。这可能会在几个月后发生。
解决方案3:如果需要ssl,但服务器标识并不重要。在这种情况下,ssl通常只用于加密网络传输。我们可以关闭ctl更新:
按win+r打开“运行”对话框,键入“gpedit.msc”(不带引号),然后按enter
在“本地组策略编辑器”中,展开“计算机配置”,展开“管理模板”,展开“系统”,展开“internet通信管理”,然后单击“internet通信设置”。
在“详细信息”面板中,双击“关闭自动根证书更新”,单击“启用”,然后单击“确定”。此更改将立即生效,无需重新启动。
https://blog.csdn.net/fancyf/article/details/78295964 清楚地解释了根本原因和解决方案。