我是 nHibernate 的新手,并且从一个简单的选择查询中得到了一些非常慢的结果。也许我错过了一些明显的东西。情况如下:
- 我正在使用流利的 nHibernate。
- 我正在查询一个 oracle 数据库(10g),我正在尝试返回一个人对象。
- 每条记录大约需要 16 秒!
这是我流畅的 nHibernate 代码:
public class Person
{
public virtual string PersonId { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Schema("MyTestDB");
Table("Person");
Id(i => i.PersonId);
Map(i => i.FirstName);
Map(i => i.LastName);
}
}
这是假设检索实际数据的代码:
var sessionFactory = Fluently.Configure().Database(OracleClientConfiguration.Oracle10.ConnectionString(@"User Id=tester;Password=tester99!;Data Source=MyTestDB;").ShowSql()).Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())).BuildSessionFactory();
using (var session = sessionFactory.OpenSession())
{
using (session.BeginTransaction())
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
var person = session.QueryOver<Person>()
.Where(p => p.PersonId == "1").SingleOrDefault();
stopWatch.Stop();
var ts = stopWatch.Elapsed;
var time = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds/10);
Console.WriteLine("Retrieved object: Person, Id: {0}, First Name: {1}, Last Name: {2} in [{3}]", person.PersonId, person.FirstName, person.LastName, time);
}
}
PersonId 列已编入索引并且是主键。
到目前为止,我试图解决这个问题的尝试是使用 ADO.Net 运行 nHibernate 生成的相同 sql。查询运行得非常快(秒表的经过时间为 0)。
使用 plsql developer 在数据库上运行相同的查询给出了相同的快速结果。这表明我认为它不是查询也不是数据库。
我该如何进一步调试呢?nHibernate 分析器会帮助解决这个问题(我目前没有这个可用)?
有什么想法吗?