使用C# TDengine驱动消费数据失败
Using C# TDengine driver to consume data failed
我使用C# TDengine驱动从taos数据库订阅数据。我的示例代码如下所示:
public void RunSubscribeWithoutCallback(IntPtr conn, string table)
{
PrepareData(conn, table);
string topic = $"{table}_topic";
string sql = $"select * from {table}";
IntPtr subscribe = TDengine.Subscribe(conn, true, topic, sql, null, IntPtr.Zero, 1000);
Console.WriteLine("consume from begin");
IntPtr taosRes = TDengine.Consume(subscribe);
UtilsTools.DisplayRes(taosRes);
TDengine.FreeResult(taosRes);
for (int i = 0; i < 3; i++)
{
InsertData(conn, table);
}
Console.WriteLine("consume new data");
taosRes = TDengine.Consume(subscribe);
UtilsTools.DisplayRes(taosRes);
Console.WriteLine("Unsubscribe and keep progress");
TDengine.FreeResult(taosRes);
TDengine.Unsubscribe(subscribe, false);
}
虽然输出是这样的
root@mybook:~/git_space/test/TDengine/src/connector/C#/examples# dotnet run
drop database if exists csharp_example_db success
create database if not exists csharp_example_db keep 3650 success
use csharp_example_db success
create table if not exists subscribe_without_callback (ts timestamp,i8 tinyint,i16 smallint,i32 int,i64 bigint); success
insert into subscribe_without_callback values(1646150410000,1,2,3,4) success
consume from begin
1646150410000 | 1 | 2 | 3 | 4 |
insert into subscribe_without_callback values(1646150410100,1,2,3,4) success
insert into subscribe_without_callback values(1646150410200,-1,-2,-3,-4) success
insert into subscribe_without_callback values(1646150410300,1,2,3,4) success
insert into subscribe_without_callback values(1646150410400,-1,-2,-3,-4) success
insert into subscribe_without_callback values(1646150410500,1,2,3,4) success
insert into subscribe_without_callback values(1646150410600,-1,-2,-3,-4) success
consume new data
只能第一次消费。下一次应用程序崩溃了。 taoslog 文件中没有任何错误。
有人知道如何解决这个问题吗?
我以前也遇到过这种情况。这是因为你释放了 taosRes,它是一个结构 TAOS_RES,有一些内存共享给对象订阅,它是一个结构 TAOS_SUB。他们共享一个指针 SSqlObj * pSql;
如果你释放你 'taosRes' 这将导致下一个消费段错误,这对于 C# 应用程序来说很难实现这一点。
更何况,这在TDengine的网站上已经提到了。
我使用C# TDengine驱动从taos数据库订阅数据。我的示例代码如下所示:
public void RunSubscribeWithoutCallback(IntPtr conn, string table)
{
PrepareData(conn, table);
string topic = $"{table}_topic";
string sql = $"select * from {table}";
IntPtr subscribe = TDengine.Subscribe(conn, true, topic, sql, null, IntPtr.Zero, 1000);
Console.WriteLine("consume from begin");
IntPtr taosRes = TDengine.Consume(subscribe);
UtilsTools.DisplayRes(taosRes);
TDengine.FreeResult(taosRes);
for (int i = 0; i < 3; i++)
{
InsertData(conn, table);
}
Console.WriteLine("consume new data");
taosRes = TDengine.Consume(subscribe);
UtilsTools.DisplayRes(taosRes);
Console.WriteLine("Unsubscribe and keep progress");
TDengine.FreeResult(taosRes);
TDengine.Unsubscribe(subscribe, false);
}
虽然输出是这样的
root@mybook:~/git_space/test/TDengine/src/connector/C#/examples# dotnet run drop database if exists csharp_example_db success create database if not exists csharp_example_db keep 3650 success use csharp_example_db success create table if not exists subscribe_without_callback (ts timestamp,i8 tinyint,i16 smallint,i32 int,i64 bigint); success insert into subscribe_without_callback values(1646150410000,1,2,3,4) success consume from begin 1646150410000 | 1 | 2 | 3 | 4 | insert into subscribe_without_callback values(1646150410100,1,2,3,4) success insert into subscribe_without_callback values(1646150410200,-1,-2,-3,-4) success insert into subscribe_without_callback values(1646150410300,1,2,3,4) success insert into subscribe_without_callback values(1646150410400,-1,-2,-3,-4) success insert into subscribe_without_callback values(1646150410500,1,2,3,4) success insert into subscribe_without_callback values(1646150410600,-1,-2,-3,-4) success consume new data
只能第一次消费。下一次应用程序崩溃了。 taoslog 文件中没有任何错误。 有人知道如何解决这个问题吗?
我以前也遇到过这种情况。这是因为你释放了 taosRes,它是一个结构 TAOS_RES,有一些内存共享给对象订阅,它是一个结构 TAOS_SUB。他们共享一个指针 SSqlObj * pSql;
如果你释放你 'taosRes' 这将导致下一个消费段错误,这对于 C# 应用程序来说很难实现这一点。
更何况,这在TDengine的网站上已经提到了。