Welcome

首页 / 软件开发 / .NET编程技术 / 性能优化总结(三):聚合SQL在GIX4中的应用

性能优化总结(三):聚合SQL在GIX4中的应用2012-05-24 博客园 BloodyAngel本节主要介绍,在GIX4系统中,如何应用上篇讲的方案来改善性能,如果与现有的系统环境集成在一起。大致包含以下内容:

SQL的生成

映射-数据读取方案

工厂方法-接口的命名约定

实例代码

SQL生成

GIX4系统中的所有领域模型及分布式访问机制,使用CSLA作为底层框架。而ORM机制,使用了一个非常轻量级的开源代码LiteORM实现。 模型类的定义,采用以下的格式:

可以看到,在类的元数据定义中(这里目前使用的是Attribute的形式),已经包含了对应数据表和列的信息。所以为SQL的自动化自成 提供了一定的支持。

其实,由于目前对性能要求比较高的模块少,所以用于优化查询的SQL主要还是依靠人工手写。但是由于LiteORM框架的功能比较有限, 所以这里查询出来的表格数据需要由我们自己来进行读取并封装对象。考虑到:1. 多表连接时,列名可能会重复;2. 添加/删除列时,不 要更改手写的SQL。所以至少列名应该自动生成,并不重复。我们把生成列名SQL的API都放在了所有模型的基类GEntity<T>中,如下 :

[Serializable]
public abstract class GEntity<T> : Entity<T>
where T : GEntity<T>
{
#region 直接与数据行进行交互


/// <summary>
/// 直接从数据集中取数据。
///
/// 注意:
/// 数据集中的列字段约定为:“表名_列名”,如“PBS_Name”。
/// 默认使用反射创建对象并读取数据!同“LiteORM”。
///
/// 意义:
/// 由于各个类的列名不再相同,所以这个方法的意义在于可以使用一句复杂的组合SQL加载一个聚合对象!
/// </summary>
/// <param name="rowData">
/// 这个数据集中的列字段约定为:“表名_列名”,如“PBS_Name”。
/// </param>
/// <returns>
/// 如果id值为null,则返回null。
/// </returns>
public static T ReadDataDirectly(DataRow rowData)

/// <summary>
/// 获取可用于ReadDirectly方法读取的列名表示法。如:
/// PBS.Id as PBS_Id, PBS.Name as PBS_Name, ........
/// </summary>
/// <returns></returns>
public static string GetReadableColumnsSql()

/// <summary>
/// 获取可用于ReadDirectly方法读取的列名表示法。如:
/// p.Id as PBS_Id, p.Name as PBS_Name, ........
/// </summary>
/// <param name="tableAlias">表í的?别e名?</param>
/// <returns></returns>
public static string GetReadableColumnsSql(string tableAlias)

/// <summary>
/// 获取columnName在DataRow中使用时约定的列名。
/// </summary>
/// <param name="columnName"></param>
/// <returns></returns>
public static string GetReadableColumnSql(string columnName)

public static ITable GetTableInfo()
{
//这里加载表信息时,可能需要和服务器交互。
if (Helper.IsOnServer())
{
return GetTableInfo_OnServer();
}
else
{
return GetTableInfo_OnClient();
}
}

#endregion