카테고리 없음

[씨#] SqlBulkCopy에서 NHibernate 트랜잭션 사용

행복을전해요 2021. 1. 10. 06:38

당연히 Ayende 이것도 다뤘 지만 꽤 끔찍합니다.

요점은 IDbCommandNHibernate 트랜잭션에 일반 ADO.NET 인스턴스를 등록 할 수 있다는 것을 알고 있다는 것입니다 .

var cmd = new SqlCommand ();
if (session.Transaction != null && session.Transaction.IsActive)
    session.Transaction.Enlist (cmd);
    

그러나은 SqlBulkCopy아니고 IDbCommand특정 생성자는 필요합니다 SqlTransaction(따라서 공급자 독립성에 대해서는 이미 배를 건너 뛰었습니다). 따라서 치트-귀하의 예는 다음과 같이 보일 수 있습니다.

using (var session = NHibernateHelper.OpenSession ())
using (var transaction = session.BeginTransaction ()) {
    using (var cmd = new SqlCommand ()) {
            transaction.Enlist (cmd);
            
                    var bulk = new SqlBulkCopy ((SqlConnection)session.Connection,
                                                        SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers,
                                                                                            (SqlTransaction)cmd.Transaction);
                                                                                                }
                                                                                                    // ...
                                                                                                        transaction.Commit ();
                                                                                                        }
                                                                                                        

의심 할 여지없이 오류 검사, 안전한 캐스트 등을 원할 것입니다. 불행히도 ( IDbTransaction에서 를 얻는 것조차도) 이것을 수행하는 더 현대적이고 덜 무서운 방법을 알지 못합니다 ITransaction.

-------------------

Ayene에서이 게시물 확인 :
http://ayende.com/Blog/archive/2009/08/22/nhibernate-perf-tricks.aspx

그는 NHibernate StatelessSession 또는 SqlBulkCopy 옵션을 사용하여이를 수행하는 방법을 보여줍니다. 다음과 같은 샘플 코드를 보여줍니다.

    var dt = new DataTable("Users");
    dt.Columns.Add(new DataColumn("Id", typeof(int)));
        dt.Columns.Add(new DataColumn("Password", typeof(byte[])));
            dt.Columns.Add(new DataColumn("Username"));
                dt.Columns.Add(new DataColumn("Email"));
                    dt.Columns.Add(new DataColumn("CreatedAt", typeof(DateTime)));
                        dt.Columns.Add(new DataColumn("Bio"));
                        
                            for (int i = 0; i < count; i++)
                                {
                                        var row = dt.NewRow();
                                                row["Id"] = i;
                                                        row["Password"] = Guid.NewGuid().ToByteArray();
                                                                row["Username"] ="User " + i;
                                                                        row["Email"] = i + "@example.org";
                                                                                row["CreatedAt"] =DateTime.Now;
                                                                                        row["Bio"] =  new string('*', 128);
                                                                                                dt.Rows.Add(row);
                                                                                                    }
                                                                                                    
                                                                                                    using (var connection =
                                                                                                     ((ISessionFactoryImplementor)sessionFactory).ConnectionProvider.GetConnection())
                                                                                                     {
                                                                                                         var s = (SqlConnection)connection;
                                                                                                             var copy = new SqlBulkCopy(s);
                                                                                                                 copy.BulkCopyTimeout = 10000;
                                                                                                                     copy.DestinationTableName = "Users";
                                                                                                                         foreach (DataColumn column in dt.Columns)
                                                                                                                             {
                                                                                                                                     copy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
                                                                                                                                         }
                                                                                                                                             copy.WriteToServer(dt);
                                                                                                                                             }
                                                                                                                                             


출처
https://stackoverflow.com/questions/2006024