2017-08-11 4 views
1

私はballerina 0.91を使用し、oracleデータベースでデータを取得するためにREST GETサービスを実行しようとします。次に、sql:ClientConnectorを使用したOracle Infoの例を示します。wso2 BallerinaサービスでDB接続を使用する

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

したがって、各GET内でDB接続を使用すると、データベースへの接続を開いて最後にもう一度閉じる必要があります。これは時間がかかる。

また、サービスレベルでDB接続を開くことができるので、GET以外ではDB接続を一度開き、GET内でいつでもDBを使用できます。これは非常に高速で、Composer内でサービスを実行すると、いくつかのクライアントでGETを複数回並列に使用してもうまく動作しますが、DB接続が不足していません。 しかし、ときに私がサービスをコンパイルAN私はので、私はDBの接続を使い果たすと、私はいくつかの例外を取得

ballerina run -s myService.balx 

としてサービスを実行します。

GETごとに接続を再利用できるように、DB接続をプールするにはどうしたらいいですか?GETを完了する前にプールに戻します。 サービスが停止したときにDB接続を閉じる方法はありますか?

一般的なデザインのヒントを歓迎します。

答えて

0

SQLクライアントコネクタは、デフォルトで10の接続プールサイズを作成します。プールサイズを変更する必要がある場合は、以下のようにプロパティを渡すことができます。

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

サービスレベルでコネクタを宣言するのは正しい方法です。その後、GET内でSQL操作を行うと、プールから接続を取得して実行します。

.balxファイルで使用すると、明らかにコネクタに問題があります。これはGithubリポジトリ[1]の問題として報告されています。

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

+0

こんにちは、私は0.92今使用して、新しい仕様に従って私のコードを変更し、応答していただきありがとうございます。限り、作曲家でそれを使用して、それは正常に動作し、コンパイルされた(バックス)バージョンを使用していくつかの問題になるので、修正を楽しみにしています。 – Igor

+0

こんにちは、上記の問題は修正されました。 0.95のリリースで確認できますか? –

関連する問題