C# WCF服务查询时间比直接查询DB慢6倍
第一个问题:) 我正在使用一个WCF服务,该服务从WinForms应用程序获取查询,将其转换为XML,将其发送到SQL Server DB,以XML形式返回查询数据,将其转换为DataTable并将其发送回WinForms应用程序 我测试了这个查询与直接DB查询之间的速度差异,结果显示使用我的服务会使其速度降低6倍 我需要做的是减少服务执行查询所需的时间,但我不知道它是如何工作的你对问题可能出在哪里有什么大致的想法吗?有什么方法可以提高服务的性能吗?使用JSON(而不是XML)是否有助于解决此问题? 非常感谢您阅读本文并期待伟大的答案 下面是我用来测试两个连接的代码:C# WCF服务查询时间比直接查询DB慢6倍,c#,sql-server,winforms,performance,wcf,C#,Sql Server,Winforms,Performance,Wcf,第一个问题:) 我正在使用一个WCF服务,该服务从WinForms应用程序获取查询,将其转换为XML,将其发送到SQL Server DB,以XML形式返回查询数据,将其转换为DataTable并将其发送回WinForms应用程序 我测试了这个查询与直接DB查询之间的速度差异,结果显示使用我的服务会使其速度降低6倍 我需要做的是减少服务执行查询所需的时间,但我不知道它是如何工作的你对问题可能出在哪里有什么大致的想法吗?有什么方法可以提高服务的性能吗?使用JSON(而不是XML)是否有助于解决此问
namespace TestServiceVSDatabaseSpeed
{
class Program
{
static void Main(string[] args)
{
// Initialization
DataTable dtService = new DataTable(), dtDirect = new DataTable();
Console.Write("~Direct Connection VS Service Connection~\n\nSELECT * FROM COILS\n");
Stopwatch sw1 = new Stopwatch(), sw2 = new Stopwatch();
// Direct connection test
sw1.Start();
dtDirect = GetSqlDataDirectConnection();
Single directTime = sw1.ElapsedMilliseconds;
Console.WriteLine("Direct query time: {0} ms ({1} rows)", directTime, dtDirect.Rows.Count);
sw1.Stop();
// Service connection test
sw2.Start();
dtService = GetSqlDataServiceConnection();
Single serviceTime = sw2.ElapsedMilliseconds;
Console.WriteLine("Query via service time: {0} ms ({1} rows)", serviceTime, dtService.Rows.Count);
sw2.Stop();
// Conclusion
Console.WriteLine("\nDirect Connection faster than Service Connection by {0} ms!", serviceTime - directTime);
Console.WriteLine("That's {0} times faster!", serviceTime / directTime);
Console.ReadLine();
}
/// <summary>
/// Does a direct query to the database
/// </summary>
/// <returns>A DataTable.</returns>
private static DataTable GetSqlDataDirectConnection()
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "Persist Security Info=False;User ID=MyId;Password=MyPassword;Initial Catalog=The_Catalogue;Server=ThisServer";
try
{
conn.Open();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
using (SqlCommand command = new SqlCommand("SELECT * FROM Coils", conn))
{
using (SqlDataAdapter adapter = new SqlDataAdapter(command))
{
DataTable coilTable = new DataTable("Coils");
adapter.Fill(coilTable);
return coilTable;
}
}
}
}
/// <summary>
/// Does a query to the database via the IOM Service.
/// </summary>
/// <returns>A DataTable.</returns>
private static DataTable GetSqlDataServiceConnection()
{
DataContractClient contract = new DataContractClient();
contract.Endpoint.Address = new EndpointAddress("net.tcp://localhost:8888/MyService/DataContract");
NetTcpContextBinding netTcpContextBinding = new NetTcpContextBinding(SecurityMode.None) { MaxReceivedMessageSize = 2147483647 };
contract.Endpoint.Binding = netTcpContextBinding;
contract.Endpoint.Contract = ContractDescription.GetContract(typeof(IDataContract));
return contract.ExecuteQueryNoParam("SELECT * FROM Coils", Catalog.SqlCatalog).Tables[0];
}
}
}
如果我看一下,似乎我们需要看到服务转换呼叫。 要回答您的问题:
您可以在通话后处理结果。但总而言之,性能受到严重影响是正常的,一定要使用索引,如果不使用索引,如果只选择部分项目,查询时间可能会遇到更大的问题。如果我看一下,我们似乎需要看到服务转换呼叫。 要回答您的问题:
您可以在通话后处理结果。但总而言之,性能受到严重影响是正常的,请确保使用索引,如果不使用索引,如果只选择部分项,则可能会在查询时间上遇到更大的问题。除了转换数据的开销之外,这里有相当数量的数据都必须返回到网上。有很多原因……对于一个——可以考虑NET.TCP的二进制编码。检查第一次呼叫与后续呼叫性能…因为服务可能会有一些初始化成本。服务实例可能会起到一定作用,尤其是当您的服务启动缓慢时。在服务案例中,数据表被填充,然后序列化,传输,然后反序列化…所有这些都是昂贵的。打赌开销会随着大小的增加而降低(以百分比表示)。顺便说一句,这会让我的皮肤爬行以查看通过服务连接发送的sql语句。这很可怕,而且耦合太紧……但是,使用datatable时,耦合太紧。考虑一个DATACONTRONE PoCo PoCo,它可能会更快地串行化/反序列化。除了转换数据的开销之外,这里有相当数量的数据都必须返回到网上。有很多原因……对于一个——可以考虑NET.TCP的二进制编码。检查第一次呼叫与后续呼叫性能…因为服务可能会有一些初始化成本。服务实例可能会起到一定作用,尤其是当您的服务启动缓慢时。在服务案例中,数据表被填充,然后序列化,传输,然后反序列化…所有这些都是昂贵的。打赌开销会随着大小的增加而降低(以百分比表示)。顺便说一句,这会让我的皮肤爬行以查看通过服务连接发送的sql语句。这很可怕,而且耦合太紧……但是,使用datatable时,耦合太紧。考虑一个DATACONTRONE修饰POCO,它可能会更快地序列化/反序列化。
~Direct Connection VS Service Connection~
SELECT * FROM COILS
Direct query time: 436 ms (24596 rows)
Query via service time: 2748 ms (24596 rows)
Direct Connection faster than Service Connection by 2312 ms!
That's 6.302752 times faster!