SqlDependency实现实时监控SqlServer表的变化

 该代码为使用SqlDependency实现实时监控SqlServer表变化的demo,注意数据库需要开启ServiceBroker服务,开启方法很简单,自行百度即可。

如果想要监听数据库中的多个表的变化,有两个方法。

方法一,使用多线程。每个表开一个线程,由于一个连接只能被一个SqlDataReader使用,因此需要加互斥锁;或者使用SqlDataAdapter。

方法二,创建多个数据库连接。

//以下两个全局变量的作用是控制输出,只输出表中新增加的数据
private static int flag = -1;        
private static bool isListen = false;
//连接sqlserver
public static void connectSqlServer()
{
    conn = new SqlConnection(连接字符串);
    conn.Open();
    if (conn.State == ConnectionState.Closed)
    {
        Console.WriteLine("连接失败!");
    }
    else if (conn.State == ConnectionState.Open)
    {
        Console.WriteLine("连接成功!");
    }
}
//注册监听
public static void registerListen()
{
    int cnt = 0;//控制输出
    try{
        //SqlDependency只能使用简单sql语句,并且需要在表名前加dbo
        string strqry = "select id,_NAME,_VALUE from dbo.student";
        SqlCommand cmd = new SqlCommand(strqry, connectSqlServer());
        SqlDependency dependency = new SqlDependency(cmd);
        dependency.OnChange -= new OnChangeEventHandler(Dependency_OnChange);
        dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange);
        SqlDataReader sdr = cmd.ExecuteReader();
        while (sdr.Read())
        {
            cnt++;
            if(isListen)
            {
                if (cnt > flag)
                {
                    flag = cnt;
                    string value = sdr["value"].ToString();
                    Console.WriteLine( DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "  student表新增信息:" + value);
                }
            }
            else
            {
                flag = cnt;
            }    
        }
        sdr.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}
private static void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
    //只有数据发生变化时,才重新获取数据 
    //if (e.Type == SqlNotificationType.Change)
    //{
        //SelectData();
        //Console.WriteLine("数据库发生变化   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
    //}
    isListen = true;
    registerListen();
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server自带的事务日志可以通过第三方工具或者自己编写程序来监控格的变化。以下是一种基于Java的监控方法: 1. 引入相关依赖 在Java项目中,我们需要引入以下两个依赖: ```xml <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>8.2.2.jre8</version> </dependency> <dependency> <groupId>com.github.shyiko</groupId> <artifactId>mysql-binlog-connector-java</artifactId> <version>0.13.0</version> </dependency> ``` 其中,`mssql-jdbc` 是 SQL Server 的 JDBC 驱动,`mysql-binlog-connector-java` 是用来解析 MySQL binlog 的 Java 库,我们可以用它来解析 SQL Server 的事务日志。 2. 监控数据库变化 首先,我们需要连接到 SQL Server 数据库,并订阅事务日志的变化: ```java import com.github.shyiko.mysql.binlog.BinaryLogClient; import com.github.shyiko.mysql.binlog.event.EventData; import com.github.shyiko.mysql.binlog.event.EventHeaderV4; import com.github.shyiko.mysql.binlog.event.EventType; import com.microsoft.sqlserver.jdbc.SQLServerDriver; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Arrays; public class LogMonitor { private static final String JDBC_URL = "jdbc:sqlserver://localhost:1433;databaseName=mydb"; private static final String JDBC_USER = "myuser"; private static final String JDBC_PASSWORD = "mypassword"; public static void main(String[] args) throws Exception { // 连接到 SQL Server 数据库 DriverManager.registerDriver(new SQLServerDriver()); Connection connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD); // 订阅事务日志的变化 BinaryLogClient client = new BinaryLogClient("localhost", 3306, "root", "password"); client.registerEventListener(event -> { EventHeaderV4 header = event.getHeader(); EventType type = header.getEventType(); EventData data = event.getData(); switch (type) { case EXT_WRITE_ROWS: case EXT_UPDATE_ROWS: case EXT_DELETE_ROWS: // 解析变化的数据 String[] columns = data.getColumnNames().toArray(new String[0]); Object[] values = data.getRows().stream().flatMap(Arrays::stream).toArray(); // 处理变化的数据 handleDataChange(connection, data.getTable().toString(), type, columns, values); break; default: // do nothing } }); client.connect(); } private static void handleDataChange(Connection connection, String table, EventType type, String[] columns, Object[] values) { // 处理变化的数据 System.out.format("Table %s %s: %s\n", table, type, Arrays.toString(values)); } } ``` 在这个示例中,我们使用了 `mysql-binlog-connector-java` 库来订阅事务日志的变化。`BinaryLogClient` 是这个库提供的客户端,我们可以通过它来连接到 MySQL 或者 MariaDB 数据库,并订阅事务日志的变化。在 `registerEventListener` 方法中,我们可以处理变化的数据。 3. 根据需要处理变化的数据 在 `handleDataChange` 方法中,我们可以根据需要处理变化的数据。例如,可以将变化的数据写入到日志中,或者将变化的数据发送到其他系统中进行处理。 需要注意的是,SQL Server 的事务日志格式与 MySQL 或 MariaDB 的 binlog 格式不同,因此我们需要使用特定的工具来解析 SQL Server 的事务日志。在这个示例中,我们使用了 `mysql-binlog-connector-java` 库来解析事务日志,然后再处理变化的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值