c#+windows环境 编写mysql集群服务
项目需求:
在搭建mysql集群初期的时候遇到这样的问题,如果服务器关机了或者是把搭建mysql集群的dos窗口关了,mysql集群就宕掉了,还需要重新搭建,之前搭建的时候都说直接在dos环境下搭建就可以了,一次两次的还可以接受,虽然一分钟就能搞定集群搭建,但是宕掉的次数多了,就需要思考了,如何让他关机重启以后还可以正常运行,减少这种重复性的工作,保持正常的开发不受影响。
项目思路:
1、做一个批处理
想法:写一个批处理,让他自动运行,运行完以后自动退出。
可行性分析:mysql集群的命令运行后只是出现相应的结果显示,所以不会自动运行完并退出,无法解决当前的问题
2、写一个服务
想法:通过写一个服务,让他开机自动开启,如果是服务停止了,直接启动就可以了,这样就不用输入一堆的命令了,只要服务的命名规范一点,所有人的可以轻松搭建mysql集群。
可行性分析:通过实践,这种方法已经实现
项目实现:
1、写服务
在vs中新建一个c#的windows服务 项目,在service的服务类中,调出dos窗口,并在dos窗口中写入需要执行的dos命令,下面以管理节点为例,进行说明。
<strong><span style="font-size:18px;">using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; namespace WindowsService { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { String a = Execute("c:\\mysql\\bin\\ndb_mgmd.exe --configdir=c:\\mysql\\bin\\config --config-file=c:\\mysql\\bin\\config\\config.ini --ndb-nodeid=1 --reload –initial "); if (a != null) Execute("exit"); } protected override void OnStop() { } //dosCommand Dos命令语句 public string Execute(string dosCommand) { return Execute(dosCommand, 10); } /// <summary> /// 执行DOS命令,返回DOS命令的输出 /// </summary> /// <param name="dosCommand">dos命令</param> /// <param name="milliseconds">等待命令执行的时间(单位:毫秒), /// 如果设定为0,则无限等待</param> /// <returns>返回DOS命令的输出</returns> public static string Execute(string command, int seconds) { string output = ""; //输出字符串 if (command != null && !command.Equals("")) { Process process = new Process();//创建进程对象 ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "cmd.exe";//设定需要执行的命令 startInfo.Arguments = "/C " + command;//“/C”表示执行完命令后马上退出 startInfo.UseShellExecute = false;//不使用系统外壳程序启动 startInfo.RedirectStandardInput = false;//不重定向输入 startInfo.RedirectStandardOutput = true; //重定向输出 startInfo.CreateNoWindow = true;//不创建窗口 process.StartInfo = startInfo; try { if (process.Start())//开始进程 { if (seconds == 0) { process.WaitForExit();//这里无限等待进程结束 } else { process.WaitForExit(seconds); //等待进程结束,等待时间为指定的毫秒 } // output = process.StandardOutput.ReadToEnd();//读取进程的输出 } } catch { } finally { if (process != null) process.Close(); } } return output; } } } </span></strong>
2、安装服务
如何安装服务:先创建服务,然后启动服务。
运行命令提示符 cmd.exe
输入 sc create testservicename binpath= D:\test.exe
输入 sc start testservicename 启动服务
输入 sc stop testservicename 停止服务
输入 sc delete testservicename删除服务,该服务将在下次重启后删除,在重启之前将不能注册同一个名字的服务。
运行命令提示符 cmd.exe
输入 sc create testservicename binpath= D:\test.exe
输入 sc start testservicename 启动服务
输入 sc stop testservicename 停止服务
输入 sc delete testservicename删除服务,该服务将在下次重启后删除,在重启之前将不能注册同一个名字的服务。
3、成果展示
项目总结:
刚开始研究mysql集群的时候就想写个服务,一直忙别的事情,闲下来就找老崔一块鼓捣这个,玩着玩着就弄出来了。
1、事情永远没有你想的那么难,去做就好。
2、不要做重复性的事情,代码中用的是封装,mysql集群可以使用服务。