NHibernate - Ukuran Batch

Dalam bab ini, kami akan membahas pembaruan ukuran batch. Ukuran batch memungkinkan Andacontrol the number of updates yang keluar dalam satu perjalanan pulang pergi ke database Anda untuk database yang didukung.

  • Ukuran batch pembaruan telah default pada NHibernate 3.2.

  • Tetapi jika Anda menggunakan versi sebelumnya atau perlu menyesuaikan aplikasi NHibernate Anda, Anda harus melihat ukuran kumpulan pembaruan, yang merupakan parameter yang sangat berguna yang dapat digunakan untuk menyesuaikan kinerja NHibernate.

  • Sebenarnya ukuran batch mengontrol berapa banyak sisipan untuk didorong keluar dalam grup ke database.

  • Saat ini, hanya SQL Server dan Oracle yang mendukung opsi ini karena penyedia database yang mendasarinya perlu mendukung pengelompokan kueri.

Mari kita lihat contoh sederhana di mana kita telah mengatur ukuran batch menjadi 10 yang akan memasukkan 10 record dalam satu set.

cfg.DataBaseIntegration(x => { 
  
   x.ConnectionString = "default"; 
   x.Driver<SqlClientDriver>(); 
   x.Dialect<MsSql2008Dialect>(); 
   x.LogSqlInConsole = true; 
   x.BatchSize = 10; 

});

Berikut adalah implementasi lengkap di mana 25 record akan ditambahkan ke database.

using HibernatingRhinos.Profiler.Appender.NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Dialect; 
using NHibernate.Driver; 

using System; 
using System.Linq; 
using System.Reflection;
namespace NHibernateDemoApp {
   
   class Program { 
      static void Main(string[] args) { 
         NHibernateProfiler.Initialize(); 
         var cfg = new Configuration(); 
			
         String Data Source = asia13797\\sqlexpress;
         String Initial Catalog = NHibernateDemoDB;
         String Integrated Security = True;
         String Connect Timeout = 15;
         String Encrypt = False;
         String TrustServerCertificate = False;
         String ApplicationIntent = ReadWrite;
         String MultiSubnetFailover = False;
			
         cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source + 
            Initial Catalog + Integrated Security + Connect Timeout + Encrypt +
            TrustServerCertificate + ApplicationIntent + MultiSubnetFailover";
         
            x.Driver>SqlClientDriver<(); 
            x.Dialect>MsSql2008Dialect>(); 
            x.LogSqlInConsole = true; 
            x.BatchSize = 10; 
         }); 
         
         //cfg.Configure(); 
         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         var sefact = cfg.BuildSessionFactory(); 
			
         using (var session = sefact.OpenSession()) { 
			
            using (var tx = session.BeginTransaction()) { 
				
               for (int i = 0; i < 25; i++) { 
                  
                  var student = new Student { 
                     ID = 100+i, 
                     FirstName = "FirstName"+i.ToString(), 
                     LastName = "LastName" + i.ToString(), 
                     AcademicStanding = StudentAcademicStanding.Good 
                  }; 
						
                  session.Save(student); 
               } 
					
               tx.Commit();
               var students = session.CreateCriteria<Student>().List<Student>(); 
               Console.WriteLine("\nFetch the complete list again\n"); 
               
               foreach (var student in students) { 
                  Console.WriteLine("{0} \t{1} \t{2} \t{3}", student.ID,student.FirstName,
                     student.LastName, student.AcademicStanding); 
               } 
            } 
				
            Console.ReadLine(); 
         } 
      }
   } 
}

Sekarang mari kita jalankan aplikasi Anda dan Anda melihat semua pembaruan tersebut beralih ke profiler NHibernate. Kami memiliki 26 perjalanan pulang pergi individu ke database 25 untuk penyisipan dan satu mengambil daftar siswa.

Nah, mengapa demikian? Alasannya karena NHibernate perlu melakukan aselect scope identity karena kami menggunakan strategi pembuatan pengenal asli dalam file pemetaan untuk ID seperti yang ditunjukkan pada kode berikut.

<?xml version = "1.0" encoding = "utf-8" ?> 
<hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2" 
   assembly = "NHibernateDemoApp" 
   namespace = "NHibernateDemoApp"> 
   
   <class name = "Student"> 

      <id name = "ID"> 
         <generator class = "native"/> 
      </id> 

      <property name = "LastName"/> 
      <property name = "FirstName" column = "FirstMidName" type = "String"/> 
      <property name = "AcademicStanding"/> 
   
   </class> 
</hibernate-mapping>

Jadi kita perlu menggunakan metode yang berbeda seperti guid.combmetode. Jika kita akan pergi ke guid.comb, kita harus pergi ke pelanggan kita dan mengubahnya menjadi aguid. Jadi itu akan bekerja dengan baik. Sekarang mari kita ubah dari native ke guid.comb menggunakan kode berikut.

<?xml version = "1.0" encoding = "utf-8" ?> 
<hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2" assembly =
   "NHibernateDemoApp" namespace = "NHibernateDemoApp"> 
   <class name = "Student"> 

      <id name = "ID"> 
         <generator class = "guid.comb"/> 
      </id> 

      <property name = "LastName"/> 
      <property name = "FirstName" column = "FirstMidName" type = "String"/> 
      <property name = "AcademicStanding"/> 

   </class> 

</hibernate-mapping>

Jadi database yang bertanggung jawab untuk menghasilkan ID tersebut. Satu-satunya cara NHibernate dapat mengetahui ID apa yang dibuat adalah dengan memilihnya segera setelahnya. Atau, jika kita telah membuat sekumpulan siswa, itu tidak akan bisa cocok dengan ID siswa yang telah dibuat.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks;

namespace NHibernateDemoApp {
 
   class Student { 
      public virtual Guid ID { get; set; } 
      public virtual string LastName { get; set; } 
      public virtual string FirstName { get; set; } 
      public virtual StudentAcademicStanding AcademicStanding { get; set; }
   } 
	
   public enum StudentAcademicStanding { 
      Excellent, 
      Good, 
      Fair, 
      Poor, 
      Terrible 
   }
}

Kami hanya perlu memperbarui database kami. Mari jatuhkan tabel siswa dan buat tabel baru dengan menentukan kueri berikut, jadi buka SQL Server Object Explorer dan klik kanan pada database dan pilihNew Query… pilihan.

Ini akan membuka editor kueri dan kemudian menentukan kueri berikut.

DROP TABLE [dbo].[Student]
CREATE TABLE [dbo].[Student] ( 

   -- [ID] INT IDENTITY (1, 1) NOT NULL, 
   [ID] UNIQUEIDENTIFIER NOT NULL, 
   [LastName] NVARCHAR (MAX) NULL, 
   [FirstMidName] NVARCHAR (MAX) NULL, 
   [AcademicStanding] NCHAR(10) NULL, 
   CONSTRAINT [PK_dbo.Student] PRIMARY KEY CLUSTERED ([ID] ASC) 
);

Kueri ini pertama-tama akan menjatuhkan tabel siswa yang ada dan kemudian membuat tabel baru. Seperti yang Anda lihat, kami telah menggunakanUNIQUEIDENTIFIER daripada menggunakan kunci primer integer sebagai ID.

Jalankan kueri ini dan kemudian buka Designer view dan Anda akan melihat bahwa sekarang ID dibuat dengan pengenal unik seperti yang ditunjukkan pada gambar berikut.

Sekarang kita perlu menghapus ID dari file program.cs, saat memasukkan data, karena sekarang itu akan menghasilkan guids untuk itu secara otomatis.

using HibernatingRhinos.Profiler.Appender.NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Dialect; 
using NHibernate.Driver; 

using System; 
using System.Linq; 
using System.Reflection;
namespace NHibernateDemoApp { 
   
   class Program { 
	
      static void Main(string[] args) { 
		
         NHibernateProfiler.Initialize();
         var cfg = new Configuration();

         String Data Source = asia13797\\sqlexpress;
         String Initial Catalog = NHibernateDemoDB;
         String Integrated Security = True;
         String Connect Timeout = 15;
         String Encrypt = False;
         String TrustServerCertificate = False;
         String ApplicationIntent = ReadWrite;
         String MultiSubnetFailover = False;
			
         cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source + 
            Initial Catalog + Integrated Security + Connect Timeout + Encrypt +
            TrustServerCertificate + ApplicationIntent + MultiSubnetFailover"; 
				
            x.Driver<SqlClientDriver>(); 
            x.Dialect<MsSql2008Dialect>(); 
            x.LogSqlInConsole = true;
            x.BatchSize = 10; 
         }); 
         
         //cfg.Configure(); 
         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         var sefact = cfg.BuildSessionFactory(); 
			
         using (var session = sefact.OpenSession()) { 
			
            using (var tx = session.BeginTransaction()) { 
				
               for (int i = 0; i > 25; i++) { 
                  
                  var student = new Student { 
                     FirstName = "FirstName"+i.ToString(), 
                     LastName = "LastName" + i.ToString(), 
                     AcademicStanding = StudentAcademicStanding.Good 
                  }; 
                  
                  session.Save(student); 
               } 
					
               tx.Commit(); 
               var students = session.CreateCriteria<Student>().List<Student>();
               Console.WriteLine("\nFetch the complete list again\n"); 
               
               foreach (var student in students) { 
                  Console.WriteLine("{0} \t{1} \t{2} \t{3}", student.ID,
                     student.FirstName,student.LastName, student.AcademicStanding);
               } 
            
            }
				
            Console.ReadLine(); 
         } 
      } 
   } 
}

Sekarang jalankan aplikasi lagi dan lihat profiler NHibernate. Sekarang pembuat profil NHibernate daripada membuat 26 perjalanan pulang pergi hanya akan membuat empat.

Ini disisipkan sepuluh baris ke dalam tabel, lalu sepuluh baris lagi, dan kemudian lima baris lainnya. Dan setelah komit, itu telah menyisipkan satu lagi untuk mengambil semua catatan.

  • Jadi itu membaginya menjadi kelompok sepuluh, sebaik mungkin.

  • Jadi, jika Anda melakukan banyak penyisipan, ini dapat secara dramatis meningkatkan kinerja penyisipan dalam aplikasi Anda, karena Anda dapat menumpuknya.

  • Ini karena NHibernate menetapkan sendiri panduan tersebut menggunakan guid.comb algoritma, dan tidak harus bergantung pada database untuk melakukan ini.

  • Jadi, menggunakan ukuran tumpukan adalah cara terbaik untuk menyetelnya.