Feedback
2007-11-13 20:03 |
//注意,分布式数据库查询不能启用事务
Mapper.Instance().BeginTransaction(isolationLevel);
try
{
o_ruleHashtable = uiTable;
//进行最后的数据交互
m_ruleDataSet = Mapper.Instance().Insert(mapID, o_ruleHashtable);
o_ruleHashtable.Clear();
m_ruleDataSet.Clear();
Mapper.Instance().CommitTransaction();
}
catch (Exception e)
{
errMsg = c_obj.m_errBaseMsg + e.Message.ToString();
errState = true;
Mapper.Instance().RollBackTransaction();
}
循环就可以开启事务进行处理,IBatisNet
回复 引用
OracleClient或OleDb的Adapter能够采用这种批处理么的方式?
回复 引用 查看
@怀念家驹
OracleClient 可以
把 SqlBatcher 的 SqlDataAdapter 类改成 OracleDataAdapter 即可
由于批处理是由 Provider 自己实现的, OleDbDataAdapter 没有实现不知道目标数据库,所以 OleDb,Odbc Provider 都不支持批处理。
只要看 XXDataAdapter 是否重写 AddToBatch 就知道能否支持批处理了。
回复 引用 查看
不错不错,正好要用到这个功能,谢谢博主分享
回复 引用 查看
2007-11-15 01:52 |
谢谢,我收藏了
回复 引用
2008-06-26 15:41 |
foreach (TelnetRecord record in recordArray)
{
pc.Create(request, session, st, record);
m_Batcher.AddToBatch(GetCommand(request.IDbCommand));
}
这一段效率为什么奇低???
回复 引用
@dwc
这里的 SqlBatcher 是较为原始的版本,方法调用和属性获取都是使用后期绑定的反射调用。
明天我发一个较新的版本上来,这个版本使用 IBatisNet 提供的动态方法实现的委托作为反射调用的替换。
这是其中一部分原因。
第二个原因可能就是你写的 SQL 有问题。
回复 引用 查看
2008-06-27 12:18 |
我发现效率奇低的一句话是这句,插入10000条13个字段的时间要40几秒....
pc.Create(request, session, st, record);
这句是创建为IbatisNet创建Command对象,不知为什么这么慢。SqlBatcher类和楼主一样,调用时代码如下:
public int Save(string statementName, object[] recordArray)
{
if (recordArray == null)
throw new ArgumentNullException("recordArray");
if (recordArray.Length < 1)
throw new ArgumentException("recordArray");
ISqlMapSession session = null;
if (sqlMap.LocalSession == null)
session = sqlMap.OpenConnection();
else
session = sqlMap.LocalSession;
IMappedStatement mappedStatment = sqlMap.GetMappedStatement(statementName);
IStatement st = mappedStatment.Statement;
IPreparedCommand pc = mappedStatment.PreparedCommand;
// 执行批处理命令
m_Batcher.StartBatch(session.Connection as SqlConnection, session.Transaction as SqlTransaction);
RequestScope request = st.Sql.GetRequestScope(mappedStatment, recordArray[0], session);
try
{
foreach (object record in recordArray)
{
pc.Create(request, session, st, record);
m_Batcher.AddToBatch(m_InnerCommandField.GetValue(request.IDbCommand) as IDbCommand);
}
int ret = m_Batcher.ExecuteBatch();
m_Batcher.EndBatch();
return ret;
}
catch (Exception ex)
{
throw ex;
}
}
回复 引用
2008-06-27 12:19 |
希望楼主帮俺看一下,就剩这个问题解决了我的框架就搭好了,公司催的紧。谢谢
回复 引用
@dwc
pc.Create(request, session, st, record);
这一句是 IBatis 通过你预先定义的映射信息创建命令,具体完全取决于你的处理器。除了升级硬件,基本没办法可以提升性能了。
说出你的机器配置也许会更有参考价值。
回复 引用 查看
2008-06-30 09:42 |
现在做开发的机器再差也差不到哪去吧,我的机器配置:CPU是赛扬2.66G,1G内存,80G 7200转的硬盘,就算差一点,也不至于你插3万条数据只要3,4秒,我插1万条却要44秒吧?
回复 引用
2008-06-30 14:48 |
这种方法好是好,但是对于主从表的这种对象(也就是主Object中包含了子Object,并且都需要插入数据库),对于这种情况,必须在插入主Object之后,得到新记录id,然后再插入子Object....
并且,如果有多层子Object的情况。。。这种情况就感觉不能做批量了。。
回复 引用
@ronotian
INSERT INTO parent_table VALUES(#parentObj.Name#);
DECLARE pid AS INT
SELECT @pid=SELECT @@IDENTITY
INSERT INTO sub_table VALUES(@pid, #parentObj.SubObj.Name#);
不是做不到
是你没有想到方法
回复 引用 查看
我更新了一下 SqlBatcher,就在上面的示例中,可以略微提高性能。
在我工作机上插入 3w 条的结果如下:
{
初始化用了 310 毫秒
生成数据用了 408 毫秒
准备数据用了 1726 毫秒。
批量插入数据用了 10080 毫秒。
}
机器为 Pentium E2140
回复 引用 查看
2008-07-01 14:11 |
谢谢楼主,我试过了,确实是我工作机配置的问题,谢谢!
回复 引用
2008-07-18 11:13 |
谢谢楼主的无私~,
回复 引用