2017-08-11 4 views
1

Ich benutze ballerina 0.91 und versuche, einen REST GET Service zu machen, um Daten über eine Oracle-Datenbank zu bekommen. Im Folgenden finden Sie die Oracle-Info mit einem sql: ClientConnector.wso2 Ballerina mit DB Verbindungen mit Diensten

service<http> MyService { 

@http:GET {} 
@http:Path {value: "/myService"} 
resource apiGET (message m) { 

    string driverClass = "oracle.jdbc.driver.OracleDriver"; 
    string dbURL = "jdbc:oracle:thin:@xxx:1521:yyy"; 
    string username = "aaa"; 
    string password = "bbb"; 
    map propertiesMap = {"driverClassName":driverClass,"jdbcUrl":dbURL, "username":username, "password":password}; 
    sql:ClientConnector myConnection = create sql:ClientConnector(propertiesMap); 

    <getting data from the database and prepare to send back to client> 

    message response = {}; 
    messages:setJsonPayload(response, myData);   
    sql:ClientConnector.close(myConnection);   

    reply response; 
} 
} 

So in jedem die DB-Verbindung mit GET ich die Verbindung zur Datenbank öffnen und es am Ende wieder zu schließen. Dies ist zeitaufwändig.

Alternativ könnte ich die DB-Verbindung auf der Service-Ebene öffnen, also außerhalb der GET, würde dies die DB-Verbindung einmal öffnen und innerhalb der GET kann ich immer die DB verwenden. Dies ist sehr schnell und in der Ausführung des Dienstes innerhalb Composer funktioniert alles gut, auch wenn ich das GET mit einigen Clients parallel mehrmals benutze, habe ich nicht die DB Connections. Aber wenn ich den Service kompilieren ein Ich betreibe den Dienst als

ballerina run -s myService.balx 

so ich aus DB-Verbindungen laufen und ich eine Ausnahme erhalten.

Wie kann ich DB Connection auf eine Art zusammenfassen, so dass ich eine Verbindung für jedes GET wiederverwenden kann und bevor ich das GET beende, schicke ich es zurück an den Pool. Wie kann ich eine DB-Verbindung schließen, wenn der Dienst heruntergefahren wird?

Jeder allgemeine Designhinweis ist willkommen.

Antwort

0

Der SQL Client Connector erstellt standardmäßig eine Verbindungspoolgröße von 10. Wenn Sie die Poolgröße ändern müssen, können Sie Eigenschaften wie folgt übergeben.

sql:ConnectionProperties properties = {maximumPoolSize:5}; 
sql:ClientConnector testDB = create sql:ClientConnector(sql:MYSQL, "localhost", 3306, "db", "sa", "root", properties); 

Das Deklarieren des Connectors auf der Serviceebene ist der richtige Weg. Wenn Sie dann innerhalb von GET SQL-Operationen ausführen, erhält es eine Verbindung vom Pool und führt sie aus.

Anscheinend gibt es ein Problem im Connector, wenn es in .balx-Dateien verwendet wird. Dies wurde als Problem im Github-Repository gemeldet [1].

[1] https://github.com/ballerinalang/ballerina/issues/3222

+0

Hallo, danke für die Antwort, ich benutze jetzt 0,92 und änderte meinen Code nach der neuen Spezifikation. Soweit es im Composer verwendet wird, funktioniert es gut und während Sie mit der kompilierten (balx) Version schreiben, kommt ein Problem auf, also freue ich mich auf eine Korrektur. – Igor

+0

Hallo, das obige Problem wurde behoben. Können Sie bitte mit 0.95 Release überprüfen? –

Verwandte Themen