将 HTTP 线程处理程序连接到会话池。
Connect HTTP thread handlers to SessionPools.
我们正在使用 PoCo 项目库文档中设置的模型。每个与 http 服务器的连接都会生成一个 thread/Handler。我们希望将每个线程连接到一个共享的 SessionPoolContainer(SPC)。我们假设我们应该在 HandlerFactory 中实例化 SPC 并为处理程序提供对 SPC 的引用。
class Handler: public Poco::Net::HTTPRequestHandler{
public:
Handler(SessionPoolContainer &spc){
//Here is where it goes wrong. "spc is private."
SessionPool sp = spc.getPool("p1");
//Todo fetch a session once we have the sessionpool reference.
}
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response){
//Do stuff.
}
};
class HandlerFactory : public Poco::Net::HTTPRequestHandlerFactory{
public:
SessionPoolContainer spc;
Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest &request){
Poco::Data::MySQL::Connector::registerConnector();
AutoPtr<SessionPool> p1 = new SessionPool("MySQL", "host=127.0.0.1;port=3306;db=testdb2;user=bachelor;password=bachelor;compress=true;auto-reconnect=true");
spc.add(p1);
if (request.getContentType().compare("Application/JSON")) {
return new Handler(spc);
}
}
};
class MyWebHTTPServerApplication : public Poco::Util::ServerApplication{
protected:
int main(const std::vector<std::string> &args){
// Instanciate HandlerFactory
Poco::Net::HTTPServer server(new HandlerFactory(), socket, pParams);
server.start();
//SIC
}
};
我们从这里得到的错误是(从第 3 行开始):
/home/notandi/git/poco-1.7.2-all/cmake_install/debug/include/Poco/Data/SessionPool.h:187:9: 错误:'Poco::Data::SessionPool::SessionPool(const Poco::Data::SessionPool&)' 是私有的
会话池(常量会话池&);
^ /home/notandi/QT/MySQLWithPool/main.cpp:68:41: 错误:在此上下文中
会话池 sp = spc.getPool("p");
从我现在的位置来看,这只需要工作并传递引用。
我已经尝试 "friend class Handler;" 在 Handler 中,状态没有变化。
SessionPoolContainer 的相关部分如下所示:
private:
typedef std::map<std::string, AutoPtr<SessionPool>, Poco::CILess> SessionPoolMap;
SessionPoolContainer(const SessionPoolContainer&);
SessionPoolContainer& operator = (const SessionPoolContainer&);
SessionPoolMap _sessionPools;
Poco::FastMutex _mutex;
我是否使用 "friend class Handler;" 编辑和重新编译带有 SessionPoolContainer 的 PoCo?我该如何解决这个问题,或者我只是认为这一切都是错误的?
从发布的代码来看,似乎根本不需要池容器,因为 p1
池从未添加到池容器中;因此,即使您可以编译,spc
也不会包含会话池;仅当您连接到多个数据库时,使用 SessionPoolContainer 才有意义,在这种情况下,您必须将会话池添加到池容器中:
spc.add(p1);
但是,如果不需要 SessionPoolContainer,则只需将对 SessionPool 的引用传递给处理程序并从中获取会话:
class Handler: public Poco::Net::HTTPRequestHandler{
public:
Handler(SessionPool &sp){
Session s = sp.get();
}
//...
};
查看 this code 以更好地了解如何使用会话池及其容器。
我们正在使用 PoCo 项目库文档中设置的模型。每个与 http 服务器的连接都会生成一个 thread/Handler。我们希望将每个线程连接到一个共享的 SessionPoolContainer(SPC)。我们假设我们应该在 HandlerFactory 中实例化 SPC 并为处理程序提供对 SPC 的引用。
class Handler: public Poco::Net::HTTPRequestHandler{
public:
Handler(SessionPoolContainer &spc){
//Here is where it goes wrong. "spc is private."
SessionPool sp = spc.getPool("p1");
//Todo fetch a session once we have the sessionpool reference.
}
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response){
//Do stuff.
}
};
class HandlerFactory : public Poco::Net::HTTPRequestHandlerFactory{
public:
SessionPoolContainer spc;
Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest &request){
Poco::Data::MySQL::Connector::registerConnector();
AutoPtr<SessionPool> p1 = new SessionPool("MySQL", "host=127.0.0.1;port=3306;db=testdb2;user=bachelor;password=bachelor;compress=true;auto-reconnect=true");
spc.add(p1);
if (request.getContentType().compare("Application/JSON")) {
return new Handler(spc);
}
}
};
class MyWebHTTPServerApplication : public Poco::Util::ServerApplication{
protected:
int main(const std::vector<std::string> &args){
// Instanciate HandlerFactory
Poco::Net::HTTPServer server(new HandlerFactory(), socket, pParams);
server.start();
//SIC
}
};
我们从这里得到的错误是(从第 3 行开始): /home/notandi/git/poco-1.7.2-all/cmake_install/debug/include/Poco/Data/SessionPool.h:187:9: 错误:'Poco::Data::SessionPool::SessionPool(const Poco::Data::SessionPool&)' 是私有的 会话池(常量会话池&); ^ /home/notandi/QT/MySQLWithPool/main.cpp:68:41: 错误:在此上下文中 会话池 sp = spc.getPool("p");
从我现在的位置来看,这只需要工作并传递引用。
我已经尝试 "friend class Handler;" 在 Handler 中,状态没有变化。 SessionPoolContainer 的相关部分如下所示:
private:
typedef std::map<std::string, AutoPtr<SessionPool>, Poco::CILess> SessionPoolMap;
SessionPoolContainer(const SessionPoolContainer&);
SessionPoolContainer& operator = (const SessionPoolContainer&);
SessionPoolMap _sessionPools;
Poco::FastMutex _mutex;
我是否使用 "friend class Handler;" 编辑和重新编译带有 SessionPoolContainer 的 PoCo?我该如何解决这个问题,或者我只是认为这一切都是错误的?
从发布的代码来看,似乎根本不需要池容器,因为 p1
池从未添加到池容器中;因此,即使您可以编译,spc
也不会包含会话池;仅当您连接到多个数据库时,使用 SessionPoolContainer 才有意义,在这种情况下,您必须将会话池添加到池容器中:
spc.add(p1);
但是,如果不需要 SessionPoolContainer,则只需将对 SessionPool 的引用传递给处理程序并从中获取会话:
class Handler: public Poco::Net::HTTPRequestHandler{
public:
Handler(SessionPool &sp){
Session s = sp.get();
}
//...
};
查看 this code 以更好地了解如何使用会话池及其容器。