将HTTP线程处理程序连接到SessionPools。

时间:2016-05-09 10:48:15

标签: c++ multithreading qt c++11 poco-libraries

我们正在使用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;?我如何解决这个问题,或者我只是认为这一切都错了?

1 个答案:

答案 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以更好地了解如何使用会话池及其容器。