问题描述
先贴代码。Command=Connection.CreateCommand();Command.CommandText=string.Format("select{0}.nextvalfromdual",country.SequenceName);intid=int.Parse(Command.ExecuteScalar().ToString());if(cellarray.ContainsKey("ID"))cellarray["ID"]=id;elsecellarray.Add("ID",id);StringBuildercell_sb=newStringBuilder();cell_sb.AppendFormat("INSERTINTO{0}(",country.oracleTableName);StringBuildervalues_sb=newStringBuilder("VALUES(");inti=0;foreach(KeyValuePair<string,object>cellincellarray){if(i!=0){cell_sb.Append(',');values_sb.Append(',');}cell_sb.AppendFormat(""{0}"",cell.Key);stringparamName=string.Format(":{0}",cell.Key);values_sb.Append(paramName);Command.Parameters.Add(newOracle.DataAccess.Client.OracleParameter(paramName,cell.Value));i++;}Command.CommandText=string.Format("{0}){1})",cell_sb,values_sb);Command.ExecuteNonQuery();方法用来拼接一个INSERT语句,最后执行。需求是讲Excel中的数据,导入到Oracle数据库中,当连续执行40+万次,大概运行2小时左右,执行到红色代码位置,程序就停住不动。不会报异常,这是关掉本地连接后重新打开,红色语句报错。否则会卡在这里不运行。尝试过的解决办法但都失败:连续执行10万次后重新newOracleConnection,任然会遇到同样的问题。google了几篇文章,据说是由于连接池中的连接过期导致,但我是持续的执行INSERT操作,怎么会过期呢。采用Oracle.DataAccess.Client.OracleConnection.ClearAllPools()方法清空连接池后,问题依然存在。请问有何其他解决办法?
解决方案
解决方案二:
看了你的代码你只是连续拼接sql语句并没有连续执行插入数据方法具体如何做还是看看高手吧
解决方案三:
这个方法主要是负责拼接和执行一条INSERT语句。cellarray只一个字典,其中包含了从Excel读取过来的所有列、值对。外部是有方法来循环调用这个插入方法的。
解决方案四:
看你用的是ODP.NET,既然你是批量导入几十万数据,为什么不适用它提供的大批量数据导入的API呢,安装ODP.NET之后应该都有例子的吧,可以照葫芦画瓢
解决方案五:
批量导入的方式可以提高程序性能,正在尝试修改。但我觉得可能还会遇到连接超时的问题。这个问题造成的原因是什么呢?求解。
解决方案六:
该回复于2014-07-30 14:19:43被版主删除
解决方案七:
有高手来帮忙解答吗?
解决方案八:
你有事务写吧,你插入的数据很多,当你关闭的时候有可能还没插完,当你再次运行的时候又要重新开始插入,而你插入的是新的语句,没有调用update。所以有事务,到你停止的时候数据会自动回滚的我用的是sqlserver我觉得原理应该一样
解决方案九:
解决方案十:
恩感谢你的提醒,我现在改为使用ODP的批量插入,已经挂上事务了,同时上传速度也有显著提升。我就想搞懂,为啥会卡在哪不懂。什么原因。·
解决方案十一:
周一了。高手请进啊。
解决方案十二:
你一直在循环读取excle的内容,十几万的数据,你拼接sql语句就需要2个小时。你打开数据库没有操作,没有关闭,最后只能是超时。
解决方案十三:
引用11楼zhaolei_zsy的回复:
你一直在循环读取excle的内容,十几万的数据,你拼接sql语句就需要2个小时。你打开数据库没有操作,没有关闭,最后只能是超时。
正解连接一直在等待操作。这么搞貌似数据库被你一个人挂起了吧!别人还能用??个人觉得不建议这么用吧
解决方案十四:
引用12楼F546445693的回复:
Quote: 引用11楼zhaolei_zsy的回复:
你一直在循环读取excle的内容,十几万的数据,你拼接sql语句就需要2个小时。你打开数据库没有操作,没有关闭,最后只能是超时。正解连接一直在等待操作。这么搞貌似数据库被你一个人挂起了吧!别人还能用??个人觉得不建议这么用吧
请注意看我的代码,2个小时不是什么事都没错。每条数据拼接完成后都会立即提交到数据库。
解决方案十五:
继续等答案。知情者请进~!
解决方案:
我就说我现在看到的吧,,你每次读取数据后,然后打开连接,这是判断连接打开没有,如果没有,就把连接打开,然后将输入导入,导入完后,关闭连接,然后继续循环,这样绝对不会再出问题了吧
解决方案:
引用15楼qq7413755的回复:
我就说我现在看到的吧,,你每次读取数据后,然后打开连接,这是判断连接打开没有,如果没有,就把连接打开,然后将输入导入,导入完后,关闭连接,然后继续循环,这样绝对不会再出问题了吧
这个办法没用的。
解决方案:
是不是可以分批执行啊
解决方案:
一个Excel40W+数据是不是太大了???
解决方案:
你一直在用序列去查出Command.CommandText=string.Format("select{0}.nextvalfromdual",country.SequenceName);intid=int.Parse(Command.ExecuteScalar().ToString());我不清楚你要做什么,但我想是不是讲序列和触发器用作一起,那样你插入的时候就不需要再去序列去查询了。你要思考一下,40几万的数据,那样的数据量也不算小。
解决方案:
引用19楼zhaolei_zsy的回复:
你一直在用序列去查出Command.CommandText=string.Format("select{0}.nextvalfromdual",country.SequenceName);intid=int.Parse(Command.ExecuteScalar().ToString());我不清楚你要做什么,但我想是不是讲序列和触发器用作一起,那样你插入的时候就不需要再去序列去查询了。你要思考一下,40几万的数据,那样的数据量也不算小。
再接一下,你最好是在sql语句上好好下下功夫。
解决方案:
Oracle.DataAccess.Client.OracleCommand.ArrayBindCount这个设置下然后付值就只要付一个数组