运行 并行查询
Running queries in Parallel
我需要通过 ADO.Net 优化我的数据访问。对于项目的要求,我不能使用 Linq 或 Entity...
所以我发起了 15 个独立 ADO.NET 查询。我遵循标准,打开连接,启动查询,使用 DataReader 获取数据,将它们存储在 类 中,最后我关闭连接...
但我觉得这个项目还不够快。那么,伙计们,你们能教我一些提高速度的技巧吗?
我的数据库是 SQL 服务器,我会尽我所能按实体启动查询。
已编辑:
private void Connect(string comando) {
try {
string cadena = "connection_data";
Cn = new SqlConnection(cadena);
Cn.Open();
SqlCommand Com = new SqlCommand(comando, Cn);
Datos = Com.ExecuteReader();
}
catch (Exception e)
{
//
}
}
private void Close()
{
try
{
Cn.Close();
Datos.Close();
}
catch (Exception e)
{
//
}
}
public List<class1> getClass1(double id)
{
Connect("SELECT TOP (5) CASE WHEN [table1].[attribute1] IN (7, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29) THEN 'random_name' " +
"WHEN [table1].[attribute3] = NULL AND [table1].[attribute2] = NULL THEN 'random_name2' WHEN [table1].[attribute3] = NULL THEN [table1].[attribute3] ELSE "
// bla bla bla bla and so on and I have 15 massive queries like this one;
List<class1> res = new List<class1>();
if (Datos.HasRows == true)
{
while (Datos.Read())
{
class1obj = new class1();
obj.at1= class1.cont + 1;
obj.at2= class1.cont + 1;
class1.cont++;
obj.at3= "random_value";
obj.at4= Datos.GetValue(0);
obj.at5= Datos.GetValue(1);
res.Add(obj);
}
Close();
}
return res;
}
如果你确实有为每个 class 创建的功能,那么你可以做的是这样的:
不是函数getClass1
而是接口:
public interface IBuildClass<TClass>
{
Task<IEnumerable<TClass>> BuildAsync(double id);
}
为接口添加一个基础 class,该接口将请求作为数据库连接对象的依赖项
public abstract class BuildClassBase<TClass> : IBuildClass<TClass>
{
public BuildClassBase(SqlConnection connection)
{
Connection = connection;
}
public async Task<IEnumerable<TClass>> BuildAsync(double id)
{
//Execute query and pass results to InnerBuid
return InnerBuildAsync(/*Pass DataTable*/);
}
public abstract async Task<IEnumerable<TClass>> InnerBuildAsync(DataTable data);
//Ctor of each derived class will set the value
public string Query { get; protected set; }
public SqlConnection Connection {get; set; }
}
然后是与您要创建的每个 class 相匹配的特定实现。您还可以为他们添加一个工厂:
public interface IBuildClassFactory
{
IBuildClass<TClass> GetBuilder<TClass>();
}
然后在您当前执行所有 15 个方法的代码中,您可以为每个 class 创建一个 Task
,然后是 await buildClassFactory.GetBuilder<ClassA>().BuildAsync(id)
。类似于:
double id = 1;
Task createClassA = buildClassFactory.GetBuilder<ClassA>().BuildAsync(id);
Task createClassB = buildClassFactory.GetBuilder<ClassB>().BuildAsync(id);
Task createClassC = buildClassFactory.GetBuilder<ClassC>().BuildAsync(id);
....
Task.WaitAll(createClassA, createClassB, createClassC....);
//And then get result from tasks
我需要通过 ADO.Net 优化我的数据访问。对于项目的要求,我不能使用 Linq 或 Entity...
所以我发起了 15 个独立 ADO.NET 查询。我遵循标准,打开连接,启动查询,使用 DataReader 获取数据,将它们存储在 类 中,最后我关闭连接...
但我觉得这个项目还不够快。那么,伙计们,你们能教我一些提高速度的技巧吗?
我的数据库是 SQL 服务器,我会尽我所能按实体启动查询。
已编辑:
private void Connect(string comando) {
try {
string cadena = "connection_data";
Cn = new SqlConnection(cadena);
Cn.Open();
SqlCommand Com = new SqlCommand(comando, Cn);
Datos = Com.ExecuteReader();
}
catch (Exception e)
{
//
}
}
private void Close()
{
try
{
Cn.Close();
Datos.Close();
}
catch (Exception e)
{
//
}
}
public List<class1> getClass1(double id)
{
Connect("SELECT TOP (5) CASE WHEN [table1].[attribute1] IN (7, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29) THEN 'random_name' " +
"WHEN [table1].[attribute3] = NULL AND [table1].[attribute2] = NULL THEN 'random_name2' WHEN [table1].[attribute3] = NULL THEN [table1].[attribute3] ELSE "
// bla bla bla bla and so on and I have 15 massive queries like this one;
List<class1> res = new List<class1>();
if (Datos.HasRows == true)
{
while (Datos.Read())
{
class1obj = new class1();
obj.at1= class1.cont + 1;
obj.at2= class1.cont + 1;
class1.cont++;
obj.at3= "random_value";
obj.at4= Datos.GetValue(0);
obj.at5= Datos.GetValue(1);
res.Add(obj);
}
Close();
}
return res;
}
如果你确实有为每个 class 创建的功能,那么你可以做的是这样的:
不是函数getClass1
而是接口:
public interface IBuildClass<TClass>
{
Task<IEnumerable<TClass>> BuildAsync(double id);
}
为接口添加一个基础 class,该接口将请求作为数据库连接对象的依赖项
public abstract class BuildClassBase<TClass> : IBuildClass<TClass>
{
public BuildClassBase(SqlConnection connection)
{
Connection = connection;
}
public async Task<IEnumerable<TClass>> BuildAsync(double id)
{
//Execute query and pass results to InnerBuid
return InnerBuildAsync(/*Pass DataTable*/);
}
public abstract async Task<IEnumerable<TClass>> InnerBuildAsync(DataTable data);
//Ctor of each derived class will set the value
public string Query { get; protected set; }
public SqlConnection Connection {get; set; }
}
然后是与您要创建的每个 class 相匹配的特定实现。您还可以为他们添加一个工厂:
public interface IBuildClassFactory
{
IBuildClass<TClass> GetBuilder<TClass>();
}
然后在您当前执行所有 15 个方法的代码中,您可以为每个 class 创建一个 Task
,然后是 await buildClassFactory.GetBuilder<ClassA>().BuildAsync(id)
。类似于:
double id = 1;
Task createClassA = buildClassFactory.GetBuilder<ClassA>().BuildAsync(id);
Task createClassB = buildClassFactory.GetBuilder<ClassB>().BuildAsync(id);
Task createClassC = buildClassFactory.GetBuilder<ClassC>().BuildAsync(id);
....
Task.WaitAll(createClassA, createClassB, createClassC....);
//And then get result from tasks