我想在类中重复使用相同的 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 的正确、最佳方式是什么?
我想使用 gRPC 公开一个接口,用于在两个服务之间双向传输大型数据集(~100 MB)。因为默认情况下 gRPC 强加了 4 MB 的消息大小限制,所以似乎首选的方法是手动编码块的流,并在接收端重新组装它们 [ 1 ][ 2 ]。
但是,gRPC 还允许通过grpc.max_receive_message_length和增加消息大小限制grpc.max_send_message_length,从而可以直接传输大小高达 ~2 GB 的消息,而无需任何手动分块或流式传输。快速测试表明,这种更简单的方法在性能和吞吐量方面同样有效,使其看起来更适合此用例。假设整个数据集都需要在内存中。
这些方法中的一种是否天生比另一种更好?更简单的非分块方法是否有任何潜在的副作用?我是否可以依靠较低层的 MTU 相关分片足以避免网络延迟和其他障碍?
参考:
我有一个单独的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)
鉴于.a库与open62541库代码捆绑在一起,据说是从同一个源构建的,为什么前两种方法在警告和错误产生方面不一致?为什么一个工作而另一个不工作?
一种方法 …
假设我有两个集合,一个包含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)