一、开发环境
-
开发工具:Visual Studio 2019
-
数据库:SQL Server2012
-
开发环境:.Net Core 3.1
二、使用技术
-
Signalr:实现消息推送
-
SqlDependency:通过它的 OnChangeEventHandler 事件去监听数据库的波动【只针对 SQL Serer】
-
Microsoft.EntityFrameworkCore:连接数据库
三、业务逻辑(虽然最后没做成,但是这技术我还学会了)
开发场景:客户需要每一个参加展会的人,签到时候,需要在展会的大屏幕实时显示签到人的信息。
思考:如果让以前的我做,一想到就是做 AJAX 异步请求数据,设置循环间隔时间。但是这样会有问题,第一如果时间设置太长,无法实现实时,如果时间设置太短,会发送很多无效的请求大量占用资源,这个时间就无法去定义。
思路:此时,我在想,如果要是【有人盯着】数据库,当数据有变化的时候,【有人通知】能通知我们,这样岂不是完美了,敢想就敢干,Just Doing!
四、使用的技术讲解
有人盯着:通过在百度海洋的搜索,了解到了 SqlDependency 可以实现这个效果,连接数据库之后,编写查询语句【有注意点,后面讲】,然后使用 SqlCommand 初始化连接对象和执行的语句,在将 SqlDependency 初始化填入 SqlCommand 对象,然后给 SqlDependency 添加事件,然后执行 SqlCommand 命令。当数据库的某张表数据变动,就会触发 SqlDependency 添加的事件。
有人通知:Signalr可以实现推送消息,应用程序启动之后,浏览器和服务器会建立一个连接(Signalr不懂可以百度看看原理),当服务器有什么需要推送的,可以推送指定的人、组,以及所有人。
五、效果展示
六、注意事项
-
编写的 SQL:查询语句中不能使用 *,表名要加[dbo].[xx]
-
在你的数据库中需要开启 BROKER:
ALTER DATABASE [你需要监听的数据库的表名称] SET NEW_BROKER
WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [你需要监听的数据库的表名称] SET ENABLE_BROKER;
在数据库执行命上面两个命令。
-
创建 GlobalHubServer 服务,用户获取实例对象(当我们监听到数据库变动的时候,我们需要通知,可以通过 GlobalHubServer 和我们的 ChatHub 实现依赖注入,这样容器给我创建了一个实例,我们只需要注入就行了)。
-
Signalr中自定义的方法,注意格式驼峰命令法
-
SqlDependency 需要提起开启
七、参考文档
-
启用数据库的 Service Broker
--is_broker_enabled 为 0 未启用,为 1 启用 SELECT name,is_broker_enabled FROM sys.databases WHERE name = 'DBNAME'
ALTER DATABASE DbName SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DbName SET ENABLE_BROKER;
-
GlobalHubServer 由来
Get started with ASP.NET Core SignalR
八、不足的地方
这个只是测试代码,如果在实际情况中,不知道会不会出问题,打算使用 Redis 做缓存,处理并发的请求,后面有时间写个 API,进行接口压力测试一下效果,如果有好的方案,欢迎来探讨!
九、结尾
为什么没贴代码了,你看看我给的几个文档就可以做出来,动手实践才是硬道理,如果有功能实现不了的,可以给我留言
转自:喜欢吃鱼的青年
cnblogs.com/2828sea/p/13402532.html