Nhibernate在oracle批量插入失败,求解?
<property name="adonet.batch_size">100</property>加了这句,发现在oracle不起作用。一样的代码,如果在sql08下运行能生效。
using (var session = SessionFactory.NHSessionFactory.OpenStatelessSession())
{
using (var tx = session.BeginTransaction())
{
try
{
foreach (var entity in entities)
{
session.Insert(entity);
}
tx.Commit();
}
catch (Exception ex)
{
}
}
}
oracle运行后如下图:
SQL08执行后如下图:
明显看出oracle不支持批量插入那样。再深看了NH源代码发现oracle批量导入,有一个类,NHibernate.AdoNet.OracleDataClientBatchingBatcherFactory
打算引入该类:
<property name="adonet.factory_class">NHibernate.AdoNet.OracleDataClientBatchingBatcherFactory,NHibernate</property>
但插入时看到有批量导入的样子了,但事务提交tx.commit或session.flush().报了一个对象无法实例化的错误,然后把这个session通道关闭了。又再尝试引用NH源码入项目调试,但没有发现效果。
--------------------编程问答-------------------- 我批量更新到是没有问题。批量插入我现在试试。
话说,你拿NHProfiler或者控制台能检测到生成的sql吗? --------------------编程问答-------------------- 我本地测试通过,并没有使用OracleDataClientBatchingBatcherFactory,数据也是oracle,也使用了事务。批量更新成功。
建议session.insert改为session.save试试
代码如下
/// <summary>--------------------编程问答--------------------
/// 批量添加
/// </summary>
/// <param name="listEntity"></param>
public virtual void BatchAdd(IList<TEntity> listEntity)
{
using (ISession session = NHibernateHelper.CreateSession())
{
using (var tx = session.BeginTransaction())
{
foreach (TEntity entity in listEntity)
{
if (NHibernateHelper.Validate(entity))
{
if (entity == null)
{
throw new ArgumentNullException("Add objects cannot be empty!");
}
session.Save(entity);
}
}
tx.Commit();
//session.Flush();
}
LogHelper.AddOptLog(session, typeof(TEntity).Name, "insert", "BatchAdd");
}
}
哥位,能加你QQ么?我尝试过还是不行哦。
--------------------编程问答--------------------