关于大数据量异构数据间数据传输及简单的多线程

     这几天写东西遇到了大量数据从informix导出到sql的问题,开始的反映就是使用DTS,但是需要在程序中每天重复这个动作,而且有些表是要覆盖导出的,有些表则是增量导出的,在DTS中不好控制,而且客户也不希望使用DTS来实现,所以就直接把数据取到内存中的DataSet,使用DataAdapter来insert到sql中也不错,开始测试了一万条左右的数据,列数为100列左右,竟然使用了差不多一分种的时间,这样算起来的话,我岂不是要导个200分钟?而且这是取出来放到内存中的,数据不大还可以,否则再多的内存也不够用的。
     否定DataSet,那就使用DataReader来实现吧,这样内存中只会存放当前一条记录,而且DataReader是向后只读的,速度很快,把每读出来的记录Insert到Sql中,这样速度还是和使用DataAdapter差不多,大概能快那么一点。
 1 None.gif public   void  InsertIIM(OleDbTransaction tIfx,SqlTransaction tSql)
 2 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 3InBlock.gif            //string strSql = "select  *  from IIM where serialcolumn not in (select pk from tabdtsc where tab='IIM')";
 4InBlock.gif            string strSql = "select  *  from IIM ";
 5InBlock.gif
 6InBlock.gif            OleDbCommand olecmd = new OleDbCommand(strSql,this.cnnIfx,tIfx);
 7InBlock.gif
 8InBlock.gif            System.Data.OleDb.OleDbDataReader oledr;
 9InBlock.gif            oledr = olecmd.ExecuteReader(); 
10InBlock.gif            
11InBlock.gif            SqlCommand cmd = new SqlCommand();
12InBlock.gif            cmd.Transaction = tSql;
13InBlock.gif            cmd.Connection =  this.cnn;
14InBlock.gif
15InBlock.gif            cmd.CommandText = "truncate table IIM ";
16InBlock.gif            cmd.ExecuteNonQuery ();
17InBlock.gif
18InBlock.gif            string strIntSql = "";
19InBlock.gif            object[] objColumn = new object[oledr.FieldCount];
20InBlock.gif            while (oledr.Read())
21ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
22InBlock.gif                strIntSql ="insert into iim values(";
23InBlock.gif                oledr.GetValues(objColumn);
24InBlock.gif                for(int i=0;i<objColumn.Length-1;i++)
25ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
26InBlock.gif                    if(objColumn[i].GetType().ToString()=="System.DBNull")
27InBlock.gif                        strIntSql+=" null,";
28InBlock.gif                    else
29InBlock.gif                        strIntSql+="'"+objColumn[i].ToString()+"',";
30ExpandedSubBlockEnd.gif                }

31InBlock.gif
32InBlock.gif                
33InBlock.gif                if(objColumn[objColumn.Length-1].GetType().ToString()=="System.DBNull")
34InBlock.gif                    strIntSql+=" null)";
35InBlock.gif                else
36InBlock.gif                    strIntSql+="'"+objColumn[objColumn.Length-1].ToString()+"')";    
37InBlock.gif
38InBlock.gif                cmd.CommandText = strIntSql;
39InBlock.gif                cmd.ExecuteNonQuery();                
40ExpandedSubBlockEnd.gif            }

41InBlock.gif            oledr.Close();
42ExpandedBlockEnd.gif        }
     这样虽然实现了,速度还是不能让人满意,于是使用了多线程,因为是从多个表中取数据,insert到sql对应的表中,所以对于每个表开了一个线程,由于使用的是oledb连接的informix数据库,使用了事务,而提示不支持并行事务,所以对于每个线程创建了一个informix的连接,最后速度当然是大大的提高了。
 1 None.gif Thread[] m_thdX  =   new  Thread[ 5 ];
 2 None.gif
 3 None.gif            m_thdX[ 0 =   new  Thread( new  ThreadStart(InsertFSO));
 4 None.gif            m_thdX[ 0 ].Start();
 5 None.gif        
 6 None.gif            m_thdX[ 1 =   new  Thread( new  ThreadStart(InsertILI));
 7 None.gif            m_thdX[ 1 ].Start();
 8 None.gif
 9 None.gif            m_thdX[ 2 =   new  Thread( new  ThreadStart(InsertMBM));
10 None.gif            m_thdX[ 2 ].Start();
11 None.gif        
12 None.gif            m_thdX[ 3 =   new  Thread( new  ThreadStart(InsertIIM));
13 None.gif            m_thdX[ 3 ].Start();
14 None.gif
15 None.gif            m_thdX[ 4 =   new  Thread( new  ThreadStart(InsertITH));
16 None.gif            m_thdX[ 4 ].Start();
17 None.gif
18 None.gif            m_thdX[ 0 ].Join();
19 None.gif            m_thdX[ 1 ].Join();
20 None.gif            m_thdX[ 2 ].Join();
21 None.gif            m_thdX[ 3 ].Join();
22 None.gif            m_thdX[ 4 ].Join();
    因为在所有线程执行完毕后会有其他的操作,所以需要使用join()方法来等待线程结束。
    补充一点,不要忘记使用lock(this),来进行同步。
    搞定,不过最后不要忘记关闭informix的连接。

转载于:https://www.cnblogs.com/swang/archive/2005/07/20/196411.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值