2016-05-09 12 views
0

Wir verwenden das Modell, das in der Dokumentation der PoCo-Projektbibliothek eingerichtet wurde. Für jede Verbindung zum http-Server wird ein Thread/Handler erzeugt. Wir möchten jeden Thread mit einem gemeinsamen SessionPoolContainer (SPC) verbinden. Wir gehen davon aus, dass wir die SPC in der HandlerFactory instanziieren und dem Handler einen Verweis auf die SPC geben sollten.Verbinden Sie HTTP-Thread-Handler mit SessionPools.

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 
     } 
    }; 

Der Fehler, den wir von diesem erhalten ist (aus der 3. Zeile): /home/notandi/git/poco-1.7.2-all/cmake_install/debug/include/Poco/Data/SessionPool.h : 187: 9: Fehler: 'Poco :: Data :: SessionPool :: SessionPool (const Poco :: Daten :: SessionPool &)' ist privat SessionPool (const SessionPool &); ^ /home/notandi/QT/MySQLWithPool/main.cpp:68:41: Fehler: in diesem Kontext SessionPool sp = spc.getPool ("p");

Von wo ich sitze, das muss nur funktionieren und die Referenz weitergegeben haben.

Ich habe versucht, "Freund Klasse Handler;" in Handler ohne Statusänderung. Der entsprechende Teil des SessionPoolContainer wie folgt aussieht:

private: 
     typedef std::map<std::string, AutoPtr<SessionPool>, Poco::CILess> SessionPoolMap; 
     SessionPoolContainer(const SessionPoolContainer&); 
     SessionPoolContainer& operator = (const SessionPoolContainer&); 
     SessionPoolMap _sessionPools; 
     Poco::FastMutex _mutex; 

Muss ich bearbeiten und neu kompilieren PoCo mit SessionPoolContainer mit „Freund Klasse Handler;“? Wie komme ich da rüber oder denke ich das alles falsch?

Antwort

0

Aus dem veröffentlichten Code sieht es so aus, als ob der Pool-Container überhaupt nicht benötigt wird, weil p1 Pool nie zum Pool-Container hinzugefügt wird; Selbst wenn Sie kompilieren könnten, würde spc keine Sitzungspools enthalten. Die Verwendung von SessionPoolContainer ist nur sinnvoll, wenn Sie eine Verbindung zu mehreren Datenbanken herstellen. In diesem Fall müssen Sie dem Pool-Container einen Sitzungspool hinzufügen:

spc.add (p1);

Allerdings, wenn es keine Notwendigkeit für SessionPoolContainer ist, dann übergeben Sie einfach den Verweis auf den Handler SessionPool und eine Sitzung von ihm bekommen:

class Handler: public Poco::Net::HTTPRequestHandler{ 
    public: 
    Handler(SessionPool &sp){ 
     Session s = sp.get(); 
    } 
    //... 
}; 

Blick auf this code ein besseres Verständnis zu bekommen, wie Sitzung verwenden Pools und Behälter dafür.

+0

Wir verwenden mehrere Datenbanken. – user1685493

+0

spc.add (p1); > wird in der HandlerFactory ausgeführt. Wir verwenden mehrere Datenbanken. Thx für das Beispiel. Ich bin nicht gut darin, C++ - Code zu lesen, aber Ihr Code sieht so aus, als würde alles in einer Klasse laufen, vielleicht nicht so relevant für mein Problem? – user1685493

+0

Es ist wichtig, wenn Sie mehrere Datenbanken haben, fügen Sie jeden Pool zum 'SessionPoolContainer' hinzu, übergeben Sie einen' SessionPoolContainer & 'an den Handler und rufen Sie die gewünschte Sitzung ab:' Session s (spc.get ("MySQL: /// host = 127.0.0.1; port = 3306; db = testdb2; benutzer = bachelor; password = bachelor; compress = true; auto-reconnect = true "")) '. Oder hol den pool:' SessionPool sp (spc.get ("p1") 'und dann Sitzung:' Session s (sp.get()) '. Aber wenn Sie C++ nicht gut lesen können, ist es auch nicht erfolgreich, es zu schreiben. – Alex