【发布时间】:2019-06-04 17:59:05
【问题描述】:
我有一个 C# 应用程序,它使用 SSH.NET 库连接到服务器。应用通过多种方式对数据库执行SQL命令。
拥有一个包含所有 SQL 命令的长时间运行的 SSH 连接是否更好,例如:
using (var sshClient = getSshClient()))
{
sshClient.Connect();
if (sshClient.IsConnected)
{
using (var portForward = setupPortForward()))
{
sshClient.AddForwardedPort(setupPortForward());
portForward.Start();
// Start SQL commands
if (!sshClient.IsConnected) {
sshClient.Connect();
}
else {
executeSQLCommand1();
}
if (!sshClient.IsConnected) {
sshClient.Connect();
}
else {
executeSQLCommand2();
}
// End SQL commands
portForward.Stop();
sshClient.Disconnect();
}
}
}
或者在每个 SQL 语句的开头打开一个 SSH 连接?
using (var sshClient = setupSshClient()))
{
sshClient.Connect();
if (sshClient.IsConnected)
{
using (var portForward = setupPortForward()))
{
sshClient.AddForwardedPort(portForward);
portForward.Start();
executeSQLCommand1();
portForward.Stop();
sshClient.Disconnect();
}
}
}
using (var sshClient = setupSshClient()))
{
sshClient.Connect();
if (sshClient.IsConnected)
{
using (var portForward = setupPortForward()))
{
sshClient.AddForwardedPort(portForward);
portForward.Start();
executeSQLCommand2();
portForward.Stop();
sshClient.Disconnect();
}
}
}
众所周知,服务器有时会断开连接,所以我想第二种方法在重新建立连接的“更清洁”逻辑方面更好?或者还有其他更好的重新连接方式吗?
【问题讨论】:
-
如果服务器倾向于断开连接,它甚至可以在某个命令的中间断开一个。所以无论如何你都必须处理重新连接。
-
setup+setup+forward+start+stop+disconnect需要多长时间?您的第二个选择是将 MySQL 的每秒查询数限制在此范围内。
-
是否有理由让您在 SSH 连接之后执行 sql 命令,而不是使用相关数据库客户端库?当连接断开时,整个方法(无论是长时间运行还是单个命令)都可能会导致您出现问题,并且如果您使用数据库客户端,这将更容易处理。一些难以处理的问题是,如果连接断开,最后一个 SQL 命令是否成功完成?即使连接保持活动状态,解析输出流中的错误也会很麻烦。
-
您的交易要求是什么?每个 sql 命令是原子的还是需要包装在事务中,如果是,那么您需要第一个长时间运行的连接方法。
标签: c# mysql database ssh ssh.net