首页新闻招聘找找看知识库
  • 回复:6 浏览:2797 2010-06-04 16:37 来自 stoned

    我在做一个查询,查询代码为

    ISession session = DBUtility.NHibernateHelper.GetSessionFactory().OpenSession();//DBUtility.NHibernateHelper.GetSession();
                if (string.IsNullOrEmpty(TableName))
                {
                    LogClass.Log.Error("TableName is null");
                }
                Stopwatch sw = new Stopwatch();
                sw.Start();
                //string sql = "select * from TB_TableTemplate t where t.表单名称 = '" + TableName + "'";
                IList<TableTemplate> tables = session.CreateQuery("from TableTemplate t where t.TableName = :p").SetString("p", TableName).List<TableTemplate>();
                //session.CreateSQLQuery(sql);
                sw.Stop();
                LogClass.Log.Error(sw.ElapsedMilliseconds.ToString());
                List<TableTemplate> list = new List<TableTemplate>();
                //list.AddRange(tables.ToArray());
                session.Close();

    结果测试下来发现时间居然是4秒多。用的LoadRunner测试的,10个用户并发访问。

    当我把上文红色的代码替换成

    string sql = "select * from TB_TableTemplate t where t.表单名称 = '" + TableName + "'";

    session.CreateSQLQuery(sql);

    时,却发现时间只需要1毫秒

    实在想不通原因出在哪里,麻烦各位大大帮我分析下。

  • 李永京
    2010-06-04 21:09 李永京
    一个没执行查询,一个执行查询......
    .List<TableTemplate>()
    第1楼 回到顶楼
  • stoned
    2010-06-06 09:05 stoned
    但是第一种情况需要4秒多,会不会不正常?
    本地的数据库,而且结构不太复杂,10个字段左右。大概70条数据。而且没有级联关系。
    组长再帮我推断下正常不正常.
    第2楼 回到顶楼
  • stoned
    2010-06-07 08:50 stoned
    我把CreateSQLQuery改成
    IList<TableTemplate> tables = session.CreateSQLQuery(sql).AddEntity(typeof(TableTemplate)).List<TableTemplate>();之后,时间果然依旧是4秒。接下来,我再用ADO测试一下,看看时间是多少。
    第3楼 回到顶楼
  • stoned
    2010-06-07 09:24 stoned
    我把那段代码换成ADO查询之后,时间很快,只有10ms左右。
    查询语句是
        ISession session = null;
    DataSet ds = new DataSet();
    try
    {
    session = GetSession();
    IDbCommand command = session.Connection.CreateCommand();
    command.CommandText = sql;
    IDataReader reader = command.ExecuteReader();
    DataTable result = new DataTable();
    DataTable schemaTable = reader.GetSchemaTable();
    for (int i = 0; i < schemaTable.Rows.Count; i++)
    {
    result.Columns.Add(schemaTable.Rows[i][0].ToString());
    }
    while (reader.Read())
    {
    int fieldCount = reader.FieldCount;

    object[] values = new Object[fieldCount];
    for (int i = 0; i < fieldCount; i++)
    {
    values[i] = reader.GetValue(i);
    }
    result.Rows.Add(values);
    }
    ds.Tables.Add(result);
    reader.Close();
    }
    catch (Exception ex)
    {
    //Debug.Assert(false);
    throw ex;
    }
    return ds;
    大家再帮我看看,到底问题出在哪里?难道NH跟ADO效率真差这么多?
    第4楼 回到顶楼
  • 李永京
    2010-06-08 10:19 李永京
    第一次需要SessionFactoryBuild,所以很慢
    你这样性能对比没有意义的.....
    使用框架为了提高效率,NH做掉了很多事...
    第5楼 回到顶楼
  • Loading......
    2014-07-03 09:25 Loading......
    @李永京
    没办法,客户不会知道你用NH提高了很多效率,客户只知道,查询效率慢。
    第6楼 回到顶楼
登录后才能评论,请先登录注册