1

我使用 ballerina 0.91 并尝试做一个 REST GET 服务来获取 oracle 数据库上的一些数据。以下是在 sql:ClientConnector 上使用的 Oracle 信息。

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 与一些客户端并行使用,我也不会用完数据库连接。但是当我编译服务时,我将服务运行为

ballerina run -s myService.balx

所以我用完了数据库连接,我得到了一些例外。

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

欢迎任何一般的设计提示。

4

1 回答 1

2

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

于 2017-08-18T05:09:54.130 回答