我使用 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 之前将其发送回池。服务关闭时如何关闭数据库连接?
欢迎任何一般的设计提示。