使用NHibernate性能问题提取大块数据 [英] Large block of data fetching using NHibernate-performance issue

查看:60
本文介绍了使用NHibernate性能问题提取大块数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我有一个50k的数据块.我使用NHibernate检索所有(检索所有是必要的).但是,由于拥有通过连接5-7个表而创建的大型数据集,NHibernate大约需要一分钟.
缓慢获取的主要原因可能是表的联接,NHibernate为此表为每个表的每一行创建查询.我知道这是必要的,因为NHibernate需要将每一行映射到一个对象,但是必须消除这种开销.

有什么方法可以在BLOCK中获取数据,然后使用NHibernate创建对象.
我包括我的映射文件以及代码-
表格代码

Hi,
I have a block of 50k data. I use NHibernate to retrieve all (retrieving all is necessary). But as having large dataset which is created by joining 5-7 tables NHibernate takes around one minute.
The main cause of slow fetching might be joining of tables for which NHibernate creates queryfor each row from each table. I understand it is necessary as NHibernate needs to map each row to an object, but this overhead must be removed.

Is there any way to fetch data in BLOCK and then creating objects using NHibernate.
I am including my mapping file as well as code -
Form Code

<pre lang="c#">
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);
            }
        }

    }
}




分支机构




Branch Class

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 Class

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()
        { }
    }
}



Employee.hbm.xml



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>



Branch.hbm.xml



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>



App.config



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=MyPC;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>

推荐答案

通常,当您进行此类批量事务时,建议使用无状态会话.这是两个很好的链接,可能会对您有帮助.

http://darioquintana.com.ar/blogging/2007 /10/08/statelesssession-nhibernate-without-first-level-cache/ [ http://ayende.com/blog/4137/nhibernate-perf-tricks [ ^ ]



祝你好运!
Usually when you are doing such bulk transaction, it is advised to use stateless sessions. Here are two good links which might be helpful in your case.

http://darioquintana.com.ar/blogging/2007/10/08/statelesssession-nhibernate-without-first-level-cache/[^]

http://ayende.com/blog/4137/nhibernate-perf-tricks[^]



Good Luck!!


这篇关于使用NHibernate性能问题提取大块数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆