使用MyCouch获取数据库名称及变更的技术实现咨询
使用MyCouch获取数据库列表并监控持续变更
我来帮你搞定用MyCouch获取数据库名称并监控它们变更的需求——先上修正后的可运行代码,再给你拆解每个部分的关键点:
1. 获取所有数据库名称
要获取CouchDB上的所有数据库,需要使用服务器级别的MyCouch客户端,而不是单个数据库的客户端,代码如下:
using MyCouch; using System; using System.Threading.Tasks; // 替换为你的实际配置 var serverUrl = "http://localhost:5984"; var authString = "admin:password"; // 格式为"用户名:密码" // 创建服务器连接信息 var serverConnInfo = DbConnectionInfo.CreateServerConnection(serverUrl); serverConnInfo.BasicAuth = authString; serverConnInfo.Timeout = TimeSpan.FromMilliseconds(System.Threading.Timeout.Infinite); // 初始化服务器客户端 using var serverClient = new MyCouchServerClient(serverConnInfo); // 异步获取所有数据库名称 var allDbsResponse = await serverClient.Server.GetAllDatabasesAsync(); if (allDbsResponse.IsSuccess) { Console.WriteLine("当前所有数据库:"); foreach (var dbName in allDbsResponse.Content) { Console.WriteLine($"- {dbName}"); } } else { Console.WriteLine($"获取数据库列表失败:{allDbsResponse.StatusCode}"); }
2. 监控单个数据库的持续变更
如果要监控某个数据库的实时变更,需要针对该数据库创建客户端,并使用ObserveContinuous方法建立长连接监听。这里修正了你代码里的几个小问题(比如CancellationToken的正确管理、请求对象的语法):
// 替换为你要监控的数据库名称 var targetDbName = "your-target-db"; // 创建目标数据库的连接信息 var dbConnInfo = DbConnectionInfo.CreateDbConnection(serverUrl, targetDbName); dbConnInfo.BasicAuth = authString; dbConnInfo.Timeout = TimeSpan.FromMilliseconds(System.Threading.Timeout.Infinite); // 初始化数据库客户端 using var dbClient = new MyCouchClient(dbConnInfo); // 正确管理CancellationToken,方便后续停止监听 using var cts = new System.Threading.CancellationTokenSource(); var cancellationToken = cts.Token; // 配置变更监听请求 var changesRequest = new Requests.GetChangesRequest { Feed = ChangesFeed.Continuous, // 持续长连接模式 Since = "0", // 从序列ID 0开始,获取所有历史+实时变更 Heartbeat = 999999999, // 心跳间隔,防止连接被服务器主动断开 IncludeDocs = false // 如果需要获取完整变更文档,设为true }; // 发起持续监听并订阅事件 var changesSubscription = dbClient.Changes.ObserveContinuous(changesRequest) .Subscribe( change => { // 处理每一条变更 Console.WriteLine($"[变更通知] 序列ID: {change.Seq} | 文档ID: {change.Id} | 操作: {change.Type}"); }, error => { // 处理监听错误 Console.WriteLine($"[监听错误] {error.Message}"); }, () => { // 监听结束时的回调 Console.WriteLine("[监听结束]"); }, cancellationToken ); // 如果你需要停止监听,调用以下代码: // cts.Cancel(); // changesSubscription.Dispose();
关键注意点
- 客户端区分:
MyCouchServerClient用于服务器级操作(比如获取所有数据库),MyCouchClient用于单个数据库的操作(比如监控变更),不要搞混。 - CancellationToken管理:一定要保留
CancellationTokenSource实例,不要直接用new CancellationTokenSource().Token,否则你无法主动停止监听,容易造成资源泄漏。 - 持续连接配置:
Heartbeat参数要设置足够大的值(或者设为"true"让服务器自动处理),避免长连接因无数据被断开;Since设为"0"会拉取该数据库的所有历史变更,如果你只想监听新变更,可以设为当前最新的序列ID。 - 错误处理:务必订阅错误回调,否则监听过程中出现异常(比如网络中断)会直接导致程序崩溃。
内容的提问来源于stack exchange,提问作者Mohsen
相关产品推荐
相关产品推荐

