欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于MYSQL的轮询与监控一点点小心得

程序员文章站 2024-03-13 20:54:52
...

好久都没有动过编程这种东西了,之前用帝国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使用上,基本没有。

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