我正在Dart中创建一个后端服务器应用程序,该应用程序使用MySQL数据库存储数据。为了进行SQL调用,我使用了SqlJocky的ConnectionPool。

应用启动时我该怎么做:

  • 创建一个存储ConnectionPool
  • 的单例
  • 使用prepareExecute执行多个查询并查询

  • 在本地,这种方法很好用。现在,我将开发版本推送到了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等待释放连接时不会耗尽连接。

    09-04 02:44