我有一个50k数据块。我使用NHibernate检索所有(检索全部是必要的)。但是,由于连接5-7个表所创建的大数据集NHibernate需要大约一分钟。 缓慢抓取的主要原因可能是连接NHibernate为每个表中的每行创建查询的表。我明白这是必要的,因为NHibernate需要将每一行映射到一个对象,但这个开销必须被删除。使用NHibernate性能问题获取大块数据
有什么办法可以在BLOCK中获取数据,然后使用NHibernate创建对象。 我包括我的映射文件以及代码 -
的App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<bytecode-provider type="lcg"/>
<reflection-optimizer use="true"/>
<session-factory>
<property name="connection.provider" >
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">
Data Source=dewashish-pc\sqlexpress;Initial Catalog=NHibernateTest;Integrated Security=True;
</property>
<property name="dialect">
NHibernate.Dialect.MsSql2005Dialect
</property>
<property name="show_sql">
false
</property>
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
</session-factory>
</hibernate-configuration>
</configuration>
Branch.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateSample" namespace="NHibernateSample">
<class name="Branch" table="Branch">
<id name="BranchCode"/>
<property name="BranchCode"/>
<property name="BranchName"/>
<bag name="EmployeeList" cascade="all-delete-orphan" inverse="false" fetch="join" lazy="false">
<key column="BranchCode"/>
<one-to-many class="Employee" />
</bag>
</class>
</hibernate-mapping>
Employee.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateSample" namespace="NHibernateSample">
<class name="Employee" table="Employee">
<id name="EmployeeId"/>
<property name="EmployeeId"/>
<property name="FirstName"/>
<property name="LastName"/>
<property name="BranchCode"/>
</class>
</hibernate-mapping>
个
Banch.cs
using System.Collections.Generic;
using System.Text;
using System;
namespace NHibernateSample
{
[Serializable]
public class Branch
{
private String branchCode;
private String branchName;
private IList<Employee> employeeList = new List<Employee>();
public virtual IList<Employee> EmployeeList
{
get { return employeeList; }
set { employeeList = value; }
}
public virtual String BranchCode
{
get { return branchCode; }
set { branchCode = value; }
}
public virtual String BranchName
{
get { return branchName; }
set { branchName = value; }
}
public Branch() { }
}
}
Employee.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace NHibernateSample
{
public class Employee
{
String employeeId;
String firstName;
String lastName;
String branchCode;
public virtual String EmployeeId
{
get { return employeeId; }
set { employeeId = value; }
}
public virtual String FirstName
{
get { return firstName; }
set { firstName = value; }
}
public virtual String LastName
{
get { return lastName; }
set { lastName = value; }
}
public virtual String BranchCode
{
get { return branchCode; }
set { branchCode = value; }
}
public Employee()
{ }
}
}
Form1.cs的
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using NHibernate;
using NHibernate.Cfg;
using System.Reflection;
using System.Collections;
namespace NHibernateSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ConfigureNHibernate();
LoadData();
}
static ISessionFactory SessionFactory;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
private void LoadData()
{
sw.Start();
using (ISession session = SessionFactory.OpenSession())
{
long b = sw.ElapsedMilliseconds;
try
{
if (session.IsConnected)
{
// as br order by br.BranchCode asc
IQuery query = session.CreateQuery("from Branch");
IList<Branch> iList = query.List<Branch>();
dvData.DataSource = iList;
int a = 0;
foreach (Branch br in iList)
{
a++;
}
MessageBox.Show(((sw.ElapsedMilliseconds - b)) + " - MilliSeconds to fetch " + System.Environment.NewLine + a.ToString() + " - Rows");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
private void ConfigureNHibernate()
{
try
{
Configuration cfg = new Configuration();
cfg.Configure();
Assembly allocationAssembly = typeof(Branch).Assembly;
cfg.AddAssembly(allocationAssembly);
SessionFactory = cfg.BuildSessionFactory();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
因为我没有我不能发布的SQL事件探查器的图像足够的声誉,但会在dem上提供和。 谢谢....
我认为唯一的办法就是为此编写HQL。 – shajivk 2012-07-26 09:56:08
请您详细说明一下。谢谢。 – 2012-07-26 10:04:28
我们可以这样写'var query = this.Session.CreateQuery(@“从Employee作为内部联接e.Branch作为b与b.BranchName =:branchName”);'。有关HQL的一些信息可以在这里找到“http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-joins” – shajivk 2012-07-26 10:33:56