关于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使用上,基本没有。

我是菜鸟,如果有什么更好的方法,也请告知我一下!




你可能感兴趣的:(数据转换)