可以向数据库发送批量插入但不能更新查询
Can send batch insert but not update queries to DB
我可以成功向数据库发送批量插入请求,但不能发送更新。我尝试了不同的方法,但似乎没有任何问题可以发布批量更新。
我找不到这个问题的解决方案。我试过的一些例子(不是全部):
- nhibernate : executing updates in batches
- NHibernate bulk insert or update
- NHibernate batch insert not working
*重要。我不能使用无状态会话。
这是我用来测试这个案例的单元测试:
[Test]
public void Test_BatchUpdateTest()
{
// Arrange
const int batchSize = 2;
var dto1Oid = Guid.Empty;
var dto2Oid = Guid.Empty;
// Generates a transaction, executes the content, and commit it afterwards.
// Batch inserts are correct, both are sent with no extra roundtrips to DB.
businessObject.Transact(() => {
var dto1 = new DtoType {ArchivingDate = DateTime.Now.AddDays(-7)};
var dto2 = new DtoType {ArchivingDate = DateTime.Now};
businessObject.Save(dto1); // Calls Session.SaveOrUpdate
businessObject.Save(dto2); // Calls Session.SaveOrUpdate
dto1Oid = dto1.Oid ?? Guid.Empty;
dto2Oid = dto2.Oid ?? Guid.Empty;
}, batchSize); // Calls Session.SetBatchSize(batchSize); before executing content above, sets it back to default after commit
// Act
businessObject.Transact(() =>
{
var dto1 = businessObject.LoadObject(dto1Oid);
var dto2 = businessObject.LoadObject(dto2Oid);
// Changing data to generate Update requests (should be sent in batches)
dto1.ArchivingDate = DateTime.Now.AddDays(7);
dto2.ArchivingDate = DateTime.Now.AddDays(1);
businessObject.Save(dto1);
businessObject.Save(dto2);
}, batchSize); // Calls Session.SetBatchSize(batchSize); before executing content above, sets it back to default after commit
// Assert
//<Check DB Requests on NHibernate Profiler> // On NHProfiler, the inserts are sent in a single request as seen in "Insert request"
}
插入请求(批量正确发送):
INSERT INTO DtoType
(... Fields)
VALUES (... Values)
--//////////////////////////////////////////////////
INSERT INTO DtoType
(... Fields)
VALUES (... Values)
更新请求1(第一次更新,应该和下面的请求2一起批量):
UPDATE DtoType
SET ArchivingDate = '<updated date>'
WHERE Id = '<dto1 id>'
更新请求2(第二次更新,应该和上面的请求1一起批量):
UPDATE DtoType
SET ArchivingDate = '<updated date>'
WHERE Id = '<dto2 id>'
我的目标是为两个更新只发送 1 个请求,就像在插入请求中一样。
问题是我使用了 NHibernate v4 并且数据结构 DtoType
使用了版本控制。 NH 不支持批量更新版本化结构 v4.The v5 中添加了支持 (link here)
使用 v5 并添加 nhibernate 设置 adonet.batch_versioned_data=true
解决了我的问题。我现在可以向数据库发送批量更新请求。
我可以成功向数据库发送批量插入请求,但不能发送更新。我尝试了不同的方法,但似乎没有任何问题可以发布批量更新。
我找不到这个问题的解决方案。我试过的一些例子(不是全部):
- nhibernate : executing updates in batches
- NHibernate bulk insert or update
- NHibernate batch insert not working
*重要。我不能使用无状态会话。
这是我用来测试这个案例的单元测试:
[Test]
public void Test_BatchUpdateTest()
{
// Arrange
const int batchSize = 2;
var dto1Oid = Guid.Empty;
var dto2Oid = Guid.Empty;
// Generates a transaction, executes the content, and commit it afterwards.
// Batch inserts are correct, both are sent with no extra roundtrips to DB.
businessObject.Transact(() => {
var dto1 = new DtoType {ArchivingDate = DateTime.Now.AddDays(-7)};
var dto2 = new DtoType {ArchivingDate = DateTime.Now};
businessObject.Save(dto1); // Calls Session.SaveOrUpdate
businessObject.Save(dto2); // Calls Session.SaveOrUpdate
dto1Oid = dto1.Oid ?? Guid.Empty;
dto2Oid = dto2.Oid ?? Guid.Empty;
}, batchSize); // Calls Session.SetBatchSize(batchSize); before executing content above, sets it back to default after commit
// Act
businessObject.Transact(() =>
{
var dto1 = businessObject.LoadObject(dto1Oid);
var dto2 = businessObject.LoadObject(dto2Oid);
// Changing data to generate Update requests (should be sent in batches)
dto1.ArchivingDate = DateTime.Now.AddDays(7);
dto2.ArchivingDate = DateTime.Now.AddDays(1);
businessObject.Save(dto1);
businessObject.Save(dto2);
}, batchSize); // Calls Session.SetBatchSize(batchSize); before executing content above, sets it back to default after commit
// Assert
//<Check DB Requests on NHibernate Profiler> // On NHProfiler, the inserts are sent in a single request as seen in "Insert request"
}
插入请求(批量正确发送):
INSERT INTO DtoType
(... Fields)
VALUES (... Values)
--//////////////////////////////////////////////////
INSERT INTO DtoType
(... Fields)
VALUES (... Values)
更新请求1(第一次更新,应该和下面的请求2一起批量):
UPDATE DtoType
SET ArchivingDate = '<updated date>'
WHERE Id = '<dto1 id>'
更新请求2(第二次更新,应该和上面的请求1一起批量):
UPDATE DtoType
SET ArchivingDate = '<updated date>'
WHERE Id = '<dto2 id>'
我的目标是为两个更新只发送 1 个请求,就像在插入请求中一样。
问题是我使用了 NHibernate v4 并且数据结构 DtoType
使用了版本控制。 NH 不支持批量更新版本化结构 v4.The v5 中添加了支持 (link here)
使用 v5 并添加 nhibernate 设置 adonet.batch_versioned_data=true
解决了我的问题。我现在可以向数据库发送批量更新请求。