void _timer_Tick(object sender, EventArgs e) { List <SessionInfo> sessionList = new List <SessionInfo>(0); ConnStringBuilder strBuilder = new ConnStringBuilder() { DataSource = this._DbName, UserName = this._DbUser, Password = this._Password }; IDBMonitor dbmonitor = DBMonitorFactory.CreateDBMonitor(this._DbType); sessionList = dbmonitor.GetSessionList(strBuilder); switch (this.MonitorModeComboBox.SelectedIndex) { case 0: ShowBlockingLog(sessionList); break; case 1: ShowActiveLog(sessionList); break; default: ShowAllLog(sessionList); break; } if (this.listView1.Items.Count > 10000 && this.LogAutoSaveCheckBox.Checked) { DumpLog(); } if (DateTime.Now > this.stopDateTime.Value) { this.btnMonitorDB.Checked = false; } }
private void btnOK_Click(object sender, EventArgs e) { bool canConn = false; try { ConnStringBuilder strBuilder = new ConnStringBuilder() { DataSource = this.DbName, UserName = this.DbUser, Password = this.Password }; IDBMonitor dbmonitor = DBMonitorFactory.CreateDBMonitor(this.DbType); canConn = dbmonitor.CheckConnAndAuth(strBuilder); } catch (Exception ex) { //MessageBox.Show(ex.StackTrace); MessageBox.Show("连接失败或权限不足:" + ex.Message); canConn = false; } if (canConn == true) { DialogResult = System.Windows.Forms.DialogResult.OK; } }
void ShowBlockingLog(List <SessionInfo> sessionList) { int blockedTime = Convert.ToInt32(this.BlockTimeNumericUpDown.Value); List <SessionInfo> blockedList = sessionList.Where(s => s.blocked != 0 && s.waitTime >= blockedTime).ToList(); if (blockedList == null || blockedList.Count <= 0) { return; } // 找出所有阻塞链条上的session信息和阻塞源头 List <SessionInfo> tmpList = new List <SessionInfo>(); List <SessionInfo> rootList = new List <SessionInfo>(); foreach (var item in blockedList) { int blockId = item.blocked; SessionInfo info = null; do { // 数据库启用并行时,同一个客户端请求可能对应多个服务器端会话 //info = sessionList.Single(s => s.spid == blockId); //if (!tmpList.Any(s => s.spid == info.spid)) // tmpList.Add(info); List <SessionInfo> parentList = sessionList.Where(s => s.spid == blockId).ToList(); if (parentList == null || parentList.Count <= 0) { break; } else { foreach (var p in parentList) { if (!tmpList.Any(s => s.spid == p.spid && s.kpid == p.kpid)) { tmpList.Add(p); } } } info = sessionList.First(s => s.spid == blockId); blockId = info.blocked; if (tmpList.Any(s => s.spid == blockId)) { break; } } while (blockId != 0); if (info != null && !rootList.Any(s => s.spid == info.spid)) { rootList.Add(info); } } foreach (var item in tmpList) { if (!blockedList.Any(s => s.spid == item.spid && s.kpid == item.kpid)) { blockedList.Add(item); } } int rowIndex = 0; string dt = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); ListViewItem[] list = new ListViewItem[blockedList.Count]; foreach (var sessionInfo in blockedList) { ListViewItem lvItem = new ListViewItem((++rowIndex).ToString()); //(++rowIndex).ToString()); lvItem.SubItems.Add(dt); lvItem.SubItems.Add(sessionInfo.spid.ToString()); lvItem.SubItems.Add(sessionInfo.kpid.ToString()); lvItem.SubItems.Add(sessionInfo.blocked.ToString()); lvItem.SubItems.Add(sessionInfo.status); lvItem.SubItems.Add(sessionInfo.lastWaitType); lvItem.SubItems.Add(sessionInfo.waitResource); lvItem.SubItems.Add(sessionInfo.waitTime.ToString()); lvItem.SubItems.Add(sessionInfo.cpu_time.ToString()); lvItem.SubItems.Add(sessionInfo.logical_reads.ToString()); lvItem.SubItems.Add(sessionInfo.disk_reads.ToString()); lvItem.SubItems.Add(sessionInfo.elapsed_time.ToString()); lvItem.SubItems.Add(sessionInfo.loginName); lvItem.SubItems.Add(sessionInfo.hostName); lvItem.SubItems.Add(sessionInfo.programName); lvItem.SubItems.Add(sessionInfo.hostProcess); lvItem.SubItems.Add(sessionInfo.remarks); lvItem.SubItems.Add(sessionInfo.sqlText); list[rowIndex - 1] = lvItem; } this.listView1.BeginUpdate(); this.listView1.Items.AddRange(list); this.listView1.EndUpdate(); if (this.KillBlockCheckBox.Checked && rootList.Count > 0) { ConnStringBuilder strBuilder = new ConnStringBuilder() { DataSource = this._DbName, UserName = this._DbUser, Password = this._Password }; IDBMonitor dbmonitor = DBMonitorFactory.CreateDBMonitor(this._DbType); dbmonitor.KillRootBlockingSession(strBuilder, rootList); } }