小编w12*_*128的帖子

跨多种方法使用 SQLConnection(“使用”关键字是或否)

我想在类中重复使用相同的 SQLConnection 和不同的方法。我现在正在做的(仅测试)是在构造函数中创建和打开一个连接:

SQLConnection Connection;

Constructor(string connection_string)
{
    this.Connection = new SqlConnection(connection_string);
    this.Connection.Open();
}
Run Code Online (Sandbox Code Playgroud)

然后我在方法内部使用“this.Connection”,最后在不再需要对象时使用 this.Connection.Close() 和 Dispose() 。据我所知,在这样的每个方法中使用 'using' 会更干净(构造函数只会设置 connection_string):

using (SqlConnection connection = new SqlConnection(connection_string)) {
 connection.Open(); ...
}
Run Code Online (Sandbox Code Playgroud)

由于连接池,实际上只使用了一个连接,尽管上面的“使用”行被放置在多个方法中(例如,当它们一个接一个地被调用时),对吗?但是,这不会创建许多只需要一个的 SQLConnection 实例吗?例如:

MyClass obj(some_string);
obj.Method1(); // calls 'using SqlConnection connection = new SqlConnection'
obj.Method2(); // calls 'using SqlConnection connection = new SqlConnection'
obj.Method3(); // calls 'using SqlConnection connection = new SqlConnection'
Run Code Online (Sandbox Code Playgroud)

那么共享 SQLConnection 的正确、最佳方式是什么?

.net c# using sqlconnection

3
推荐指数
1
解决办法
2561
查看次数

我应该在没有手动分块的情况下通过 gRPC 传输大数据集吗?

我想使用 gRPC 公开一个接口,用于在两个服务之间双向传输大型数据集(~100 MB)。因为默认情况下 gRPC 强加了 4 MB 的消息大小限制,所以似乎首选的方法是手动编码块的流,并在接收端重新组装它们 [ 1 ][ 2 ]。

但是,gRPC 还允许通过grpc.max_receive_message_length和增加消息大小限制grpc.max_send_message_length,从而可以直接传输大小高达 ~2 GB 的消息,而无需任何手动分块或流式传输。快速测试表明,这种更简单的方法在性能和吞吐量方面同样有效,使其看起来更适合此用例。假设整个数据集都需要在内存中。

这些方法中的一种是否天生比另一种更好?更简单的非分块方法是否有任何潜在的副作用?我是否可以依靠较低层的 MTU 相关分片足以避免网络延迟和其他障碍?


参考:

  1. 使用 gRPC 对大消息进行分块
  2. 通过 gRPC 发送文件

http2 grpc

2
推荐指数
1
解决办法
1732
查看次数

与链接静态库相比,为什么gcc在从源代码构建时会产生不同的结果?

我有一个单独的C++ 14文件,my.cpp从中我正在尝试使用名为open62541的C99库.对于后者,存在完整源open62541.c/.h和库libopen62541.a.在my.cpp我包含的地方open62541.h,我正在使用C++特定代码(例如iostream),所以从技术上讲,我正在混合使用C和C++.

我可以my.cpp通过引用成功编译libopen62541.a:

gcc -x c++ -std=c++14 -Wall my.cpp -l:libopen62541.a -lstdc++ -o out
Run Code Online (Sandbox Code Playgroud)

这将不输出警告,并创建一个可执行文件出来.

但是,如果我尝试仅使用源代码进行编译:

gcc -x c++ -std=c++14 -Wall my.cpp open62541.c -lstdc++ -o out
Run Code Online (Sandbox Code Playgroud)

我收到很多ISO C++警告(例如" ISO C++禁止将字符串常量转换为'char '*")和一些源自内部的" 跳转到标签 "错误open62541.c,导致编译失败.

我可以使用-fpermissive开关使编译成功:

gcc -x c++ -std=c++14 -Wall my.cpp open62541.c -lstdc++ -fpermissive -o out
Run Code Online (Sandbox Code Playgroud)

它仍会输出大量警告,但会成功创建可执行文件.但是,我不确定这样做是不是一个好主意.

也许值得一提的是open62541.h在开始时考虑C++:

#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)
  1. 鉴于.a库与open62541库代码捆绑在一起,据说是从同一个源构建的,为什么前两种方法在警告和错误产生方面不一致?为什么一个工作而另一个不工作?

  2. 一种方法 …

c c++ gcc

1
推荐指数
1
解决办法
105
查看次数

有没有办法将vector <double>*指向vector <int>?

假设我有两个集合,一个包含vector<int>其他vector<double>实例.我只需要记住所有这些实例中的一个,以便根据某些标准进行进一步处理.从概念上讲,这个想法很简单:

vectorOfInterest *v;

for (i : set<vector<double>>)
    if criteria_met(i)
    {
        *v = &i,
        break;
    }

for (i : set<vector<int>>)
    if criteria_met(i)
    {
        *v = &i,
        break;
    }

// Do something with *v later.
Run Code Online (Sandbox Code Playgroud)

请注意,此处设置在概念上使用,并不是字面意思std::set.我只能在最后使用*v进行进一步处理,而不是在找到它时立即使用,因为处理逻辑依赖于在最后一个循环之后发生的各种其他步骤,并且不能提前评估.

目前,我的方法是使用void指针,然后将其转换为适当的类型,具体取决于找到感兴趣的矢量的两个集合中的哪一个:

void* vectorOfInterest;

if (vectorOfInterest found within set<vector<double>>)
{
    auto v = static_cast<std::vector<double>*>(vectorOfInterest);
    // do something with v
}
else if (vectorOfInterest found within set<vector<int>>)
{
    auto v = static_cast<std::vector<int>*>(vectorOfInterest);
    // do something with v
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想知道在C++中是否有更好的方法来实现这一点,也许一个没有使用void指针和转换?例如,类似于以下内容:

std::vector<double>* …
Run Code Online (Sandbox Code Playgroud)

c++

-4
推荐指数
1
解决办法
146
查看次数

标签 统计

c++ ×2

.net ×1

c ×1

c# ×1

gcc ×1

grpc ×1

http2 ×1

sqlconnection ×1

using ×1