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