关于MYSQL的轮询与监控一点点小心得
好久都没有动过编程这种东西了,之前用帝国CMS帮公司建了一个在线文档系统,文档转换也一直用第三方的,经常出一些问题,又没有源码可以改可以看的,时间过去久了,越来越麻烦,只能动手自己写一个。
这次自己写的时候是用C#的,之前没接触过,过程挺累的,基本语法都不懂。不过其它的查查资料也基本都搞定了。功能类与模块都写出来了。
差一个核心的功能:MYSQL的数据监控!
因为帝国CMS用的是MYSQL,所以也没太可能去换。
我要实现的功能就是写一个在线转换文档的程序,程序运行时监控MYSQL的数据更新,即有用户上传新文档或某个文档被修改时,通知程序执行转换任务;
因为使用频率不高,用轮询明显不好,间隔时间长的话实时性又不好,但间隔时间短极占资源;
在MSSQL里有一个sqldependcy类可以调用 ,可以实现监控数据的变化,onchange就好!
但MYSQL 查了两天资料,没用这东西,也尝试自己写这个类出来,也没成功。国外有个Devart.Data.MySql.dll,但要授权好像,试了一下可以用,但放到服务器上又出问题。还是自己研究。
在CSDN里看到一般就两种方案,1、触发器;2、binlog;
触发器什么的看了看可能也要轮询,又放弃。只好用binlog。
下面进入正题,希望对碰到同样问题的人有点点帮助;
1、首先把mysql的binlog打开:
在mysql的安装目录下打开my.ini,
在[mysqld]下
添加一行:
log-bin=mysql-bin
重启一下mysql的服务。
这样,在mysql 的data目录下就会生成日志文件;
2、取得当前正在使用的日志文件(MYSQL每次重启会重新建一个文件)
Object binlog1 = DbHelperMySQL.GetSingle("show master status");
//做一些数据上的处理
Object binlog1 = DbHelperMySQL.GetSingle("show master status");
Byte[] bt = (Byte[])binlog1;
binlog = System.Text.UTF8Encoding.UTF8.GetString(bt);//取得当前日志文件名
这里引用 的就不说了,就是进行数据库查询而已;
3、取得MSSQL的安装目录
Object basepath1 = DbHelperMySQL.GetSingle("select @@basedir as basePath from dual");
basepath = (String)basepath1;//取得Mysql安装路径
4、合并成完整文件地址,再取得文件大小,存入变量
basepath = basepath.Replace("/", "\\") + "data\\" + binlog;
int filesize = FileHelper.GetFileSize(basepath);
5、开始循环检测
public void dowhile(int filesize, string basepath)
{
while (filesize == FileHelper.GetFileSize(basepath))
{
int delaytime = int.Parse(readconfig("delay"))*1000;
Thread.Sleep(delaytime);
dowhile(filesize, basepath);
}
//MessageBox.Show("检测到变化:" + filesize);
startran();
}
上面就是循环读取日志文件大小,与之前取得的大小作比较,如果有差异就执行我的文档转换函数。
执行完毕后又再一次重新读取大小,如此如此。。。
看了看CPU使用上,基本没有。
我是菜鸟,如果有什么更好的方法,也请告知我一下!