我一次又一次地收到以下错误。
使用方法'mysql_native_password'对用户'root'的主机'localhost'进行身份验证失败,并显示消息:从流中读取失败。
我知道连接字符串是正确的 - 首先它在应用程序启动后进行测试,如果失败,应用程序会发出消息并退出。
其次,报告它的功能也在大多数情况下使用它来正确连接,它只是偶尔发生。
我尝试过更改为127.0.0.1,但似乎没有变化。
它位于Windows Server 2012 64位上。
我已将127.0.0.1 localhost添加到主机文件中。
99%的时间应用程序正常运行并连接到数据库,只是每次都会出现此错误。
最重要的是,我检查了show full processlist命令,我随时只有几个连接。
我迷失了解释这一点,无法弄清楚如何修复它。
谢谢, 吉姆
答案 0 :(得分:0)
这是非常古老的,但是因为我刚刚找到了解决这个问题的方法,所以我会分享它,以防万一有人还在寻找它(据我所知,这是当前Mysql版本的一个问题)太)。
this bug report中记录了这类问题。
我在这里引用该错误报告中最重要的答案:
[2014年5月21日15:40] Francisco Alberto Tirado Zavala
Hello Jorge。
当您使用Client-Server应用程序时 当您创建连接时,连接由套接字执行 在客户端和服务器之间打开一个Socket,以及一个Id / ProccesId 在服务器中为该请求的连接分配/保留 客户。如果重新启动服务器,则丢失给客户端的Id, 所以你需要创建一个新的有效连接,打开一个新的套接字 从服务器获取有效的ID。
此外,您必须考虑服务器可以终止或关闭 连接如果连接在一段时间后处于非活动状态。如果你有 您的连接打开也可能会影响您的连接池,因为 连接打开意味着您的池连接较少:有10个 同时连接的客户端距离连接点少10个 服务器可用连接。
如果您无法更改应用程序中的设计(拥有全局设计) 连接),作为一种解决方法,您可以使用一种方法来验证它 连接有效,例如以下方法ping 服务器,如果ping失败,则再次打开连接:
....
MySqlConnection _conn = new MySqlConnection("MyConnectionString");
private void CheckConnection()
{
if(!_conn.Ping())
{
_conn.Open();
}
}
....
正如您所看到的,代码非常简单,并且可以在下面进行操作 方式:当连接尝试ping服务器时,如果连接是 无效,内部具有套接字信息的流将是 终止,连接将在状态关闭时设置 如果,将从连接池中删除无效连接 存在,然后再次打开连接将创建一个新连接 这意味着一个新的有效套接字。如果ping成功,那么你会 继续使用相同的连接。
要使用它,您可以在尝试对其执行操作之前调用它 数据库,连接将在无效时重新打开:
....
private void button1_Click(object sender, EventArgs e)
{
//assuming that the connection is already open
CheckConnectionState();
var cmd = new MySqlCommand("select 1", _conn);
cmd.ExecuteNonQuery();
}
....
这只是一种解决方法,到目前为止我知道所有的连接 任何数据库服务器都具有相同的行为:如果服务器是 重启任何连接都将丢失,以及服务器将丢失 清理每个未使用的连接。
感谢您的时间。