【问题标题】:How to create Connection Pooling in Cloud Spanner for the Enterprise applications如何在 Cloud Spanner 中为企业应用程序创建连接池
【发布时间】:2018-12-30 04:42:19
【问题描述】:

我对 Cloud Spanenr 还是很陌生。我已经了解创建连接(dbClient)并用于事务和executeQuery / mutations的锄头。 但我不清楚如何为 Cloud Spanner 创建 ConnectionPooling 好吧,有 SpannerOptions、Session/SessionPoolOptions。只需创建

 SpannerOptions options = SpannerOptions.newBuilder().build();
          Spanner spanner = options.getService();
DatabaseClient dbClient = spanner.getDatabaseClient(db);

将处理企业应用程序所需的连接池。

如果我们将连接对象从 Pool 中取出并返回到池中以再次重用,而不是多次创建连接,那么是否有适当的方法来创建 JDBC/Hibernate 样式的连接池。

我已经创建了连接对象并创建了所有类型的事务,其中包含查询和突变以及其他过程。我正在创建一个集中式库来为多个 dao 提供连接(dbClient)。无法获得适当的文档或流程来实现 Cloud Spanner 连接池类的 JDBC/Hibernate 样式

 SpannerOptions options = SpannerOptions.newBuilder().build();
          Spanner spanner = options.getService();
            try {
              DatabaseId db = DatabaseId.of(options.getProjectId(),SpannerInstanceId, SpannerDatabaseId);

              String clientProject = spanner.getOptions().getProjectId();
              if (!db.getInstanceId().getProject().equals(clientProject)) {
                System.err.println(
                    "Invalid project specified. Project in the database id should match"
                        + "the project name set in the environment variable GCLOUD_PROJECT. Expected: "
                        + clientProject);
              }
              DatabaseClient dbClient = spanner.getDatabaseClient(db);
              dbClient
              .readWriteTransaction()
              .run(
                  new TransactionCallable<Void>() {
                    @Override
                    public Void run(TransactionContext transaction) throws Exception {
                        ResultSet resultSet;

目前,当需要连接时,我正在尝试对每个 Dao 方法重复相同的操作。我正在寻找一个集中的类来提供这个连接形式的连接池并将其返回给池以供重新使用。

【问题讨论】:

    标签: google-cloud-platform connection-pooling google-cloud-spanner


    【解决方案1】:

    在 Cloud Spanner 中,与数据库的长期“连接”/“通信通道”由“Session”而非DatabaseClient 对象建模。 DatabaseClient 对象已经在 SessionPool 对象内部实现了连接(会话)池,可以通过 SessionPoolOptions 进行配置。

    如果您想管理自己的会话,而不是为每个 DAO 对象提供 DatabaseClient 对象(或包装它的类),您可以初始化自己的 SessionPool 并给它们每个 Session对象(或包装它的类)。

    【讨论】:

    • 非常感谢您的回答。如果您可以举例说明如何使用 SessionPool 并为每个会话提供一个会话,这将是很大的帮助?我没有得到任何示例如何从池中获取会话并将会话返回到池和提交过程以及何时关闭连接以避免会话泄漏?
    • 您可以使用SessionPool 上的getReadWriteSession()getReadSession() 方法来获取Session 对象,并在不再需要它时调用close()。 API 记录在源代码中。
    • 客户端库在内部管理会话池,正如@adi 所提到的——您只需为您的应用程序实例创建一个 DatabaseClient。如前所述,您可以配置 SessionPoolOptions,自己使用会话会增加大量不必要的复杂性
    • 非常感谢,我对下一步有了一些想法。
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多