SK2*_*017 7 c# cpu odbc cpu-usage
我从一个自定义生产数据库远程选择结果,其标准大约是C#应用程序的三分钟.
每次执行select命令时,我使用CPU的服务器PC都会上升到50%左右.但当然,负载应该在我连接的数据库上?
在检索数据进行读取之前,为什么C#应用程序会升级到50%?
一些背景
这是我正在使用的一些代码.
OdbcConnection remoteConn = new OdbcConnection(ConfigurationManager.ConnectionStrings["remoteConnectionString"].ToString());
remoteConn.Open();
OdbcCommand remoteCommand = new OdbcCommand();
remoteCommand.Connection = remoteConn;
using (remoteConn)
{
string localSql = "";
string remoteSql = "select * from tracking where last_update > 212316247440000000"; // Julian No = 2015-07-12 11:24:00
remoteCommand.CommandText = remoteSql;
OdbcDataReader remoteReader;
remoteReader = remoteCommand.ExecuteReader();
while (remoteReader.Read())
{
for (int i = 0; i < 68; i++)
{
localSql += ",'" + remoteReader[i].ToString() + "'";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我对应用程序进行了性能和诊断测试,并得出了这个结果.
如果有的话,我可以如何减少CPU负载甚至完全消除它.它完全不同寻常,我不知道如何去做.
谢谢
谢谢你的信息,丹.这是我的想法......
我相信你的应用程序消耗这么多CPU的主要原因是因为你使用的驱动程序.
由于您要连接到SQL Server数据库,因此应使用知道如何优化客户端和服务器之间数据传输的SQL Server驱动程序.
要使用相应的驱动程序,请确保您使用SqlConnection,SqlCommand等等.
这将允许SQL Server在您查询数据读取器时将结果流式传输到客户端.
其次,不要ExecuteReader()在DbCommand对象上使用该方法.SQL Server驱动程序独有的众多精彩功能之一就是该ExecuteReaderAsync()方法.
由于此命令是IO绑定操作(不是计算绑定),因此不需要阻止调用线程.当结果返回时,它们将到达IO完成线程.
下面是代码示例,说明更改后代码的外观.
using (var remoteConn = new SqlConnection(ConfigurationManager.ConnectionStrings["remoteConnectionString"].ToString()))
{
remoteConn.Open();
using (var remoteCommand = new SqlCommand())
{
remoteCommand.Connection = remoteConn;
string localSql = "";
string remoteSql = "select * from tracking where last_update > 212316247440000000"; // Julian No = 2015-07-12 11:24:00
remoteCommand.CommandText = remoteSql;
var remoteReader = await remoteCommand.ExecuteReaderAsync();
while (remoteReader.Read())
{
for (int i = 0; i < 68; i++)
{
localSql += ",'" + remoteReader[i].ToString() + "'";
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
542 次 |
| 最近记录: |