You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:36:18