1.前言
有两个日志文件Arrive和Done,里面分别保存了程序处理一个报文的日志信息,Arrive里面保存的是报文的到达时间,Done里面保存的是报文处理完成的时间,现在想知道每个报文的处理时间是多长。如果靠人工在两个日志文件中逐个报文对比的话需要花很长的时间,于是想到了将两个报文的信息存储到数据库中,再利用数据库的强大处理功能来获得每个报文的处理时间。
2.实现
有了想法,立刻着手实现。
2.1定义数据库
在数据库中增加一个LOG_INFO的表,语法如下:
create table LOG_INFO( FILE_NAME CHAR(15) not null, ARRIVE_TIME DATE, DEAL_TIME DATE);
2.2报文解析入库
读文件并写入数据库:
1 private void btnStart_Click(object sender, EventArgs e) 2 { 3 String line, time, filename, sql; 4 int i = 0, result = 0; 5 OracleConnection conn = new OracleConnection(connectionString); 6 conn.Open(); 7 for (i = 0; i < 8; i++) 8 { 9 switch (i)10 { 11 case 0:12 lblCurrFile.Text = "Arrive3.log";13 break;14 case 1:15 lblCurrFile.Text = "Arrive2.log";16 break;17 case 2:18 lblCurrFile.Text = "Arrive1.log";19 break;20 case 3:21 lblCurrFile.Text = "Arrive.log";22 break;23 case 4:24 lblCurrFile.Text = "Done3.log";25 break;26 case 5:27 lblCurrFile.Text = "Done2.log";28 break;29 case 6:30 lblCurrFile.Text = "Done1.log";31 break;32 case 7:33 lblCurrFile.Text = "Done.log";34 break;35 default: 36 break;37 }38 if (File.Exists(tbxPath.Text + lblCurrFile.Text))39 {40 try41 {42 using (StreamReader sr = new StreamReader(tbxPath.Text + lblCurrFile.Text)) 43 {44 while ((line = sr.ReadLine()) != null) 45 {46 if (lbxReportInfo.Items.Count > 100)47 {48 lbxReportInfo.Items.Clear();49 }50 else51 {52 lbxReportInfo.Items.Add(line);53 }54 time = line.Substring(1, 19);55 filename = line.Substring(22, 15);56 57 if (lblCurrFile.Text.Substring(0, 4).Equals("Arri"))58 sql = String.Format("insert into LOG_INFO(FILE_NAME,ARRIVE_TIME) values('{0}',TO_DATE('{1}','YYYY-MM-DD HH24:MI:SS'))", filename, time);59 else60 sql = String.Format("update LOG_INFO set DEAL_TIME=TO_DATE('{0}','YYYY-MM-DD HH24:MI:SS') where FILE_NAME='{1}'", time, filename);61 // 入库62 try63 {64 OracleCommand cmd = new OracleCommand(sql, conn);65 result = cmd.ExecuteNonQuery();66 cmd.Dispose();67 }68 catch(Exception ex)69 {70 lblMsg.Text = ex.Message;71 }72 }73 }74 }75 catch (Exception ex)76 {77 lblMsg.Text = ex.Message;78 }79 }80 else81 {82 continue;83 }84 }85 conn.Close();86 }
数据库是Oracle 11g,连接字符串格式如下:
private string connectionString = "server=xxx;uid=xxx;pwd=xxx";
2.3计算报文处理时间
在PL/SQL命令窗口中输入如下命令:
select (deal_time-arrive_time)*24*60*60 from log_info;
可以得到每个报文的处理时间。由于deal_time-arrive_time的结果单位是天,通过*24*60*60将其转换为秒。当然也可以通过*24*60转换为分钟,具体看需要。
当然也可以加上一些查询条件,比如想得到处理时间大于100秒的记录就可以这样写:
select (deal_time-arrive_time)*24*60*60 from log_info where (deal_time-arrive_time)*24*60*60>100;
查询结果如下:
SQL> select (deal_time-arrive_time)*24*60*60 from log_info where (deal_time-arrive_time)*24*60*60>100; (DEAL_TIME-ARRIVE_TIME)*24*60*------------------------------ 285 322 124 136 124 129 261 7 rows selected SQL>
3.总结
程序在WinXP SP3+VS2010+Oracle 11g下测试通过。