我正在Dart中创建一个后端服务器应用程序,该应用程序使用MySQL数据库存储数据。为了进行SQL调用,我使用了SqlJocky的ConnectionPool。
应用启动时我该怎么做:
在本地,这种方法很好用。现在,我将开发版本推送到了Heroku,几分钟后我遇到了连接问题。
因此,我想知道,是否需要从用于执行查询的池中关闭/释放单个连接?还是将查询后的连接再次放置在池中并免费使用?
所有MySQL存储的抽象基类:
abstract class MySQLStore {
MySQLStore(ConnectionPool connectionPool) {
this._connectionPool = connectionPool;
}
ConnectionPool get connectionPool => this._connectionPool;
ConnectionPool _connectionPool;
}
方法getAll的具体实现:
Future<List<T>> getAll() async {
Completer completer = new Completer();
connectionPool.query("SELECT id, name, description FROM role").then((result) {
return result.toList();
}).then((rows) {
completer.complete(this._processRows(rows));
}).catchError((error) {
// TODO: Better error handling.
print(error);
completer.complete(null);
});
return completer.future;
}
我得到的错误:
最佳答案
这不能完全回答您的问题,但是我认为您可以简化代码,例如:
Future<List<T>> getAll() async {
try {
var result = await connectionPool.query(
"SELECT id, name, description FROM role");
return this._processRows(await result.toList());
} catch(error) {
// TODO: Better error handling.
print(error);
return null;
}
}
我确定这里不需要关闭与
query
的连接。我不知道prepareExecute
。根据SqlJocky代码中的注释,数据库服务器释放连接可能要花费一些时间。
也许您需要增加连接池的大小(默认为5),以便在
ConnectionPool
等待释放连接时不会耗尽连接。