我们自己开发了一个中间件来实时的读取XML数据并存储到Oracle数据库中,每10分钟读取一次。每次进行读取时软件就要占用600到800多的内存,CPU也占95%左右,此时服务器(内存为2G)非常的慢。读取的每个数据文件中包含1000多条记录,写程序时是在完全读取完一个数据文件后一次性插入到数据库中,是不是和这有关系啊。在不读取数据时占用内存很少。
先谢谢啦,很急啊!!

解决方案 »

  1.   

    是啊,如果程序先从xml读到dataset里面时候很点内存的,何况是频繁操作数据库,建议不要读到内存表里面,直接把数据从xml读到Oracle数据库;
    Oracle很少用,不过我记得sql server里面有个命令:OPENROWSET可以直接将外部数据导入数据库的,而不用经过中间的dataset;这样不知道能不能减少数据数据库的压力.
      

  2.   

    我现在插入数据程序是这样来写的
    请问怎么写能让内存的占有量降到最低呢?
    foreach (WaveStru ws in ListWStr)
                    {
                        dRow = dTable.NewRow();
                        dRow[0] = ws.dblLon;
                        dRow[1] = ws.dblLat;
                        dRow[2] = ws.dblOri;
                        dRow[3] = ws.dblVal;
                        dRow[4] = ws.FV1;
                        dRow[5] = ws.FV2;
                        dRow[6] = ws.iZero;
                        dRow[7] = ws.iType;
                        dRow[8] = ws.iIntLen;
                        dRow[9] = ws.iFloatLen;
                        dRow[10] = ws.FV3;
                        dRow[11] = ws.FV4;
                        dRow[12] = ws.FV5;
                        dRow[13] = ws.FV6;
                        dRow[14] = ws.FV7;
                        dTable.Rows.Add(dRow);
                    }                SqlStr = @"INSERT INTO FJ863_RADAR_WAVE(DATA_ID, LON, LAT, ORIE, VALUE, FV1, FV2,   
                                    ZERO, TYPE, INTLEN, FLOATLEN, FV3, FV4, FV5, FV6, FV7,PARA_ID)
                                VALUES(SEQU_RADAR_WAVE.NEXTVAL, :LON, :LAT, :ORIE, :VALUE, :FV1, :FV2,   
                                    :ZERO, :TYPE, :INTLEN, :FLOATLEN, :FV3, :FV4, :FV5, :FV6, :FV7,:SEQ_RADAR_PARA.CURRVAL)";                OleDbCommand cmd = new OleDbCommand(SqlStr, OleDbCon);
                    cmd.Parameters.Add("LON", OleDbType.Double, 10, "LON");
                    cmd.Parameters.Add("LAT", OleDbType.Double, 10, "LAT");
                    cmd.Parameters.Add("ORIE", OleDbType.Double, 10, "ORIE");
                    cmd.Parameters.Add("VALUE", OleDbType.Double, 10, "VALUE");
                    cmd.Parameters.Add("FV1", OleDbType.Double, 10, "FV1");
                    cmd.Parameters.Add("FV2", OleDbType.Double, 10, "FV2");
                    cmd.Parameters.Add("ZERO", OleDbType.Integer, 10, "ZERO");
                    cmd.Parameters.Add("TYPE", OleDbType.Integer, 10, "TYPE");
                    cmd.Parameters.Add("INTLEN", OleDbType.Integer, 10, "INTLEN");
                    cmd.Parameters.Add("FLOATLEN", OleDbType.Integer, 10, "FLOATLEN");
                    cmd.Parameters.Add("FV3", OleDbType.Double, 10, "FV3");
                    cmd.Parameters.Add("FV4", OleDbType.Double, 10, "FV4");
                    cmd.Parameters.Add("FV5", OleDbType.Double, 10, "FV5");
                    cmd.Parameters.Add("FV6", OleDbType.Double, 10, "FV6");
                    cmd.Parameters.Add("FV7", OleDbType.Double, 10, "FV7");                string selStr = @"SELECT * FROM FJ863_RADAR_WAVE";
                    OleDbDataAdapter OleAdapter = new OleDbDataAdapter(selStr, OleDbCon);
                    OleAdapter.InsertCommand = cmd;
                    OleAdapter.Fill(dTable);
                    OleAdapter.Update(dTable);                dTable.Dispose();
                    cmd.Dispose();
                    OleAdapter.Dispose();
      

  3.   

    用DataReader试一下,它不会全部读到内存中去的.不要一次性把数据全都读到内存中.
      

  4.   

    读取XML数据用的是什么对象啊?用XmlDocument是有问题的。
      

  5.   

    我用的是XmlTextReader 进行读取的,如:
     private void ReadCurr(string fileNameStr)
            {
                XmlReader reader = new XmlTextReader(fileNameStr);
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        switch (reader.LocalName)
                        {
                            case "StationData":
                                ReadStatData(reader);
                                break;                        case "row":
                                ReadCurrRowData(reader);
                                break;                        default:
                                break;
                        }
                    }
                }
            }
    读取完后构造了一个表,如:
     private void InitPara()
            {
                dTablePara = new DataTable();
                dTablePara.Columns.Add("RSIZE", Type.GetType("System.Int32"));
                dTablePara.Columns.Add("SNUMB", Type.GetType("System.Int32"));
                dTablePara.Columns.Add("SITENAME", Type.GetType("System.String"));
                dTablePara.Columns.Add("SITEINFO", Type.GetType("System.String"));
                dRowPara = dTablePara.NewRow();
            }
      

  6.   

    方便的化把代码发给我看看..我的Email是[email protected]..
    我想知道这1000多条数据的文件的大小.
    还有不可以直接读吗?读完一条就保存一条.再读再保存.
    而不用DataTable对象..??这样可以吗?