wso2 Ballerina使用DB Connections with Services

时间:2017-08-11 14:27:05

标签: ballerina

我使用芭蕾舞女演员0.91并尝试做一个REST GET服务来获取oracle数据库的一些数据。以下是使用sql:ClientConnector的Oracle Info。

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中使用数据库连接,我必须打开与数据库的连接,并在最后再次关闭它。这是时间成本。

或者我可以在服务级别打开数据库连接,因此在GET之外,这将打开数据库连接一次,在GET中我总是可以使用数据库。这非常快,并且在Composer中运行服务一切正常,即使我多次并行使用GET和一些客户端,我也没有用完DB Connections。 但是当我编译服务时,我将服务作为

运行
ballerina run -s myService.balx

所以我的DB Connections用完了,我得到了一些例外。

如何以某种方式池化数据库连接,以便我可以为每个GET重用连接,并在完成GET之前将其发送回池中。 如何在服务关闭时关闭数据库连接?

欢迎任何一般设计提示。

1 个答案:

答案 0 :(得分:1)

默认情况下,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