知识大全 .net对海量数据的插入与更新
Posted 操作
篇首语:三人行必有我师焉。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 .net对海量数据的插入与更新相关的知识,希望对你有一定的参考价值。
对于海量数据的插入和更新 ADO NET确实不如JDBC做到好 JDBC有统一的模型来进行批操作 使用起来 非常方便 PreparedStatement ps = conn prepareStatement( insert or update arg args … ) 然后你就可以 for(int i= ;i< ;i++) ps setXXX(realArg) …… ps addBatch() if(i% == ) //假设五百条提交一次 ps executeBatch() //clear Parame Batch ps executeBatch() 这样的操作不仅带来极度大的性能 而且非常方便 按说 ADO NET中 要实现这样的功能 应该直接在Command接口中 或DataAdapter接口中提供Addbat和CommitBat的API 但ADO NET的却并没有这样简单地实现 而是要求开发者通过 复杂的变通方法 对于大量的插入操作 可以利用一个空的DataTable加入要插入的行 达到一定数量提交后清空该表就行了 实现起来并不算复杂 DateTime begin = DateTime Now; string connectionString = …… using(SqlConnection conn = new SqlConnection(connectionString))… conn Open() SqlDataAdapter sd = new SqlDataAdapter() sd SelectCommand = new SqlCommand( select devid data_time data_value from CurrentTest conn) sd InsertCommand = new SqlCommand( insert into CurrentTest (devid data_time data_value) + values (@devid @data_time @data_value) conn) sd InsertCommand Parameters Add( @devid SqlDbType Char devid ) sd InsertCommand Parameters Add( @data_time SqlDbType Char data_time ) sd InsertCommand Parameters Add( @data_value SqlDbType Int data_value ) sd InsertCommand UpdatedRowSource = UpdateRowSource None; sd UpdateBatchSize = ; DataSet dataset = new DataSet() sd Fill(dataset) Random r = new Random( ) for (int i = ; i < ; i++) … object[] row = … DEVID +i DateTime Now ToString( yyyy MM dd HH:mm:ss ) r Next( ) ; dataset Tables[ ] Rows Add(row) if (i % == ) … sd Update(dataset Tables[ ]) dataset Tables[ ] Clear() sd Update(dataset Tables[ ]) dataset Tables[ ] Clear() sd Dispose() dataset Dispose() conn Close() TimeSpan ts = DateTime Now begin; MessageBox Show( ts = + ts TotalMilliseconds) 对于这个测试我插入 万条数据用时 秒 性能还算可圈可点 但是对于批量更新 搜遍全球的例子 都是把记录Fill到DataSet中然后牧举rows 来更新 就我这个小数据量的测试而言 把 万条数据Fill到DataSet中已经不能工作 如果是百万 千万如何操作?难道一定先把要批操作的记录 先获取到DataSet中?也就是我要更新哪些记录就要选查询这些记录? 于是我仍然利用一个空的DataTable来加入要更新的记录 sd SelectCommand = new SqlCommand( select devid data_time data_value from CurrentTest where = conn) // = 的条件保证取一个空表 sd UpdateCommand = new SqlCommand( update CurrentTest set data_time = @data_time data_value = @data_value where devid = @devid conn) sd UpdateCommand Parameters Add( @data_time SqlDbType Char data_time ) sd UpdateCommand Parameters Add( @data_value SqlDbType Int data_value ) sd UpdateCommand Parameters Add( @devid SqlDbType Char devid ) sd UpdateCommand UpdatedRowSource = UpdateRowSource None; sd UpdateBatchSize = ; for(int i= ;i< ;i++) …… dataset Tables[ ] Rows Add(row) sd Update(dataset Tables[ ]) 先更新 条试试 如果成功再循环更新所有记录 但提示插入操作需要InsertCommand 因为一个空表然后Add Row操作 这时RowState是Added 如果这时Update到数据库 执行的就是插入操作而无法更新 改成 for(int i= ;i< ;i++) …… row = 填入初始化的值; dataset Tables[ ] Rows Add(row) dataset AcceptChanges() for(int i= ;i< ;i++) …… dataset Tables[ ] Rows[i][x] = xxxxxxx ; …… sd Update(dataset Tables[ ]) 先在DataTable中插入数据 然后用AcceptChanges() 修改RowState为UnChanged 再修改表中数据希望改变 UnChanged状态 即将DataTable从Current状态改为Original 然后再对DataTable的Row进行更新 就能使 Update成功 但这样做确实不方便 调整思路 先从数据库中取 条(批更新的Size大小) 直接得到一个Original的DataTable sd SelectCommand = new SqlCommand( select top devid data_time data_value from CurrentTest conn) DataSet dataset = new DataSet() sd Fill(dataset) 用这 个空间来放要更新的其它数据看看 for (int i = ; i < ; i++) dataset Tables[ ] Rows[i] BeginEdit() dataset Tables[ ] Rows[i][ data_time ] = : : ; dataset Tables[ ] Rows[i][ data_value ] = ; dataset Tables[ ] Rows[i][ devid ] = DEVID +(i+ ) //更新DEVID 到DEVID 的记录 dataset Tables[ ] Rows[i] EndEdit() sd Update(dataset Tables[ ]) OK 成功 哈哈 把要更新的数据不断往这个空间填 填满就提交 这样更新 条数据只要几个循环就行了 DateTime begin = DateTime Now; string connectionString = ; using(SqlConnection conn = new SqlConnection(connectionString))… conn Open() SqlDataAdapter sd = new SqlDataAdapter() sd SelectCommand = new SqlCommand( select top devid data_time data_value from CurrentTest conn) DataSet dataset = new DataSet() sd Fill(dataset) Random r = new Random( ) sd UpdateCommand = new SqlCommand( update CurrentTest + set data_time = @data_time data_value = @data_value where devid = @devid conn) sd UpdateCommand Parameters Add( @data_time SqlDbType Char data_time ) sd UpdateCommand Parameters Add( @data_value SqlDbType Int data_value ) sd UpdateCommand Parameters Add( @devid SqlDbType Char devid ) sd UpdateCommand UpdatedRowSource = UpdateRowSource None; sd UpdateBatchSize = ; for (int count = ; count < ;) … for (int i = ; i < ; i++ count++) … dataset Tables[ ] Rows[i] BeginEdit() dataset Tables[ ] Rows[i][ data_time ] = : : ; dataset Tables[ ] Rows[i][ data_value ] = ; dataset Tables[ ] Rows[i][ devid ] = DEVID +count; dataset Tables[ ] Rows[i] EndEdit() sd Update(dataset Tables[ ]) dataset Tables[ ] Clear() sd Dispose() dataset Dispose() conn Close() TimeSpan ts = DateTime Now begin; MessageBox Show( ts = + ts TotalMilliseconds) 注意上面的更新操作是指在一个十万 百万 千万条记录中我要不断更新其中的记录 这些要更新的记录并不是从头 到尾这样的顺序 只是不断地根据条件更新任何记录 我不可能把成百上千万记录先Fill到ds中然后在ds中Select到 这条记录然后更新 所以每 次更新操作填入一次DataTable中提交 就实现了JDBC的addBat和executeBat操作 这个操作更新 万条用了 秒 还算勉强吧 cha138/Article/program/net/201311/11281相关参考
ASP.NET怎么样缓存频繁更新的数据? 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近接手
知识大全 剖析 ADO.NET 批处理更新(深入研究数据访问)
剖析ADO.NET批处理更新(深入研究数据访问) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 ADO.Net实现Oracle大批量数据的更新优化
ADO.Net实现Oracle大批量数据的更新优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
二编写优良的程序代码 处理数据离不开优秀的程序代码尤其在进行复杂数据处理时必须使用程序好的程序代码对数据的处理至关重要这不仅仅是数据处理准确度的问题更是数据处理效率的问题良好的程序代码应该包含好
六加大虚拟内存 如果系统资源有限内存提示不足则可以靠增加虚拟内存来解决笔者在实际项目中曾经遇到针对亿条的数据进行处理内存为GB个PG的CPU对这么大的数据量进行聚合操作是有问题的提示内存不足那么
十五使用数据仓库和多维数据库存储 数据量加大是一定要考虑OLAP的传统的报表可能个小时出来结果而基于Cube的查询可能只需要几分钟因此处理海量数据的利器是OLAP多维分析即建立数据仓库建立多维数
用ORACLE数据库存储海量图像数据 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在利用ORA
在实际的工作环境下许多人会遇到海量数据这个复杂而艰巨的问题它的主要难点有以下几个方面 一数据量过大数据中什么情况都可能存在 如果说有条数据那么大不了每条去逐一检查人为处理如果有上百条数据也可以
给定ab两个文件各存放亿个url每个url各占字节内存限制是G让你找出ab文件共同的url?方案可以估计每个文件安的大小为G×=G远远大于内存限制的G所以不可能将其完全加载到内存中处理考虑采取分而治之
cha138/Article/program/net/201311/14358