我们正在使用PoCo项目库文档中设置的模型。为http服务器的每个连接生成一个线程/处理程序。我们希望将每个线程连接到共享的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:错误:&#39; Poco :: Data :: SessionPool :: SessionPool( const Poco :: Data :: SessionPool&amp;)&#39;是私人的 SessionPool(const SessionPool&amp;); ^ /home/notandi/QT/MySQLWithPool/main.cpp:68:41:错误:在此上下文中 SessionPool sp = spc.getPool(&#34; p&#34;);
从我坐的地方开始,这只需要工作并传递参考。
我曾尝试过#34;朋友班Handler;&#34;在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;
我是否使用SessionPoolContainer编辑和重新编译PoCo,使用&#34;朋友类处理程序;&#34;?我如何解决这个问题,或者我只是认为这一切都错了?
答案 0 :(得分:0)
根据发布的代码,看起来根本不需要池容器,因为p1
池从未添加到池容器中;所以,即使你可以编译,spc
也不包含会话池;使用SessionPoolContainer只有在连接到多个数据库时才有意义,在这种情况下,您必须将会话池添加到池容器中:
spc.add(P1);
但是,如果不需要SessionPoolContainer,那么只需将SessionPool的引用传递给处理程序并从中获取会话:
class Handler: public Poco::Net::HTTPRequestHandler{
public:
Handler(SessionPool &sp){
Session s = sp.get();
}
//...
};
查看this code以更好地了解如何使用会话池及其容器。