X DevAPI 用户指南  / 第 2 章连接和会话概念  / 2.2 连接到会话  /  2.2.3 使用连接池连接到单个 MySQL 服务器

2.2.3 使用连接池连接到单个 MySQL 服务器

X DevAPI 支持连接池,这可以减少打开多个 MySQL 服务器连接的应用程序的开销。连接由 Client 对象作为池进行管理。当与客户端打开新会话时,在打开新网络连接之前,会尝试从池中检索现有且当前未使用的连接,然后重置并重新使用。

连接池是使用单个键值对配置的(请参阅使用键值对连接),其中包含一个名为 的键pooling。键的值pooling是另一组键值对,其中包含下表中描述的键的任意组合:

表 2.1 配置连接池的选项

选项 意义 默认
启用 启用连接池。当该选项设置为 时 false,将返回一个常规的非池化连接,并忽略下面列出的其他连接池选项。 真的
最大尺寸 池中允许的最大连接数 25
最大空闲时间 在关闭之前允许连接在队列中空闲的最大毫秒数。零值意味着无限。 0
队列超时 允许请求等待连接可用的最大毫秒数。零值意味着无限 0

关闭 Session 会将底层连接标记为未使用,并将其返回到 Client 对象的连接池。

关闭客户端对象会关闭它管理的所有连接,使客户端创建的所有会话无效,并销毁托管池。

笔记

MySQL Shell 不支持连接池。

Node.js JavaScript 代码

var mysqlx = require('@mysql/xdevapi');
var client = mysqlx.getClient(
  { user: 'user', host: 'localhost', port: 33060 },
  { pooling: { enabled: true, maxIdleTime: 30000, maxSize: 25, queueTimeout: 10000 } }
);
client.getSession()
  .then(session => {
    console.log(session.inspect())
    return session.close() // the connection becomes idle in the client pool
  })
  .then(() => {
    return client.getSession()
  })
  .then(session => {
    console.log(session.inspect())
    return client.close() // closes all connections and destroys the pool
  })

C#代码

using (Client client = MySQLX.GetClient("server=localhost;user=user:port=33060;",
  new { pooling = new { Enabled = true, MaxSize = 100, MaxIdleTime=30000, QueueTimeout = 10000 } }))
   {
      using (Session session = client.GetSession())
      {
         foreach (Collection coll in session.Schema.GetCollections())
         {
            Console.WriteLine(coll.Name);
         }
      } // session.Dispose() is called and the session becomes idle in the pool
   } // client.Dispose() is called then all sessions are closed and pool is destroyed

Python代码

connection_string = {
    'host': 'localhost',
    'port': 37210,
    'user': 'user',
    'password': 'password'
}
client_options = {
    'pooling': {
        "max_size": 10,
        "max_idle_time": 30000
    }
}
client = mysqlx.get_client(connection_string, client_options)
session1 = client.get_session()
session2 = client.get_session()

# closing all the sessions
client.close()

Java代码

//Obtain new ClientFactory
ClientFactory cf = new ClientFactory(); 

//Obtain Client from ClientFactory
Client cli = cf.getClient(this.baseUrl, "{\"pooling\":{\"enabled\":true, \"maxSize\":8, 
  \"maxIdleTime\":30000, \"queueTimeout\":10000} }");
Session sess = cli.getSession();

//Use Session as usual

//Close Client after use
cli.close();

C++代码

using namespace mysqlx;

Client cli("user:password@host_name/db_name", ClientOption::POOL_MAX_SIZE, 7);
Session sess = cli.getSession();

// use Session sess as usual

cli.close();  // close all Sessions

使用 X DevAPI for C 的连接器/C++ 代码

char error_buf[255];
int  error_code;

mysqlx_client_t *cli
 = mysqlx_get_client_from_url(
     "user:password@host_name/db_name", "{ \"maxSize\": 7 }", error_buf, &error_code
   );
mysqlx_session_t *sess = mysqlx_get_session_from_client(cli);

// use sess as before

mysqlx_close_client(cli);  // close session sess