我使用芭蕾舞女演员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之前将其发送回池中。 如何在服务关闭时关闭数据库连接?
欢迎任何一般设计提示。
答案 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]中的一个问题。