1

clsql 似乎支持连接池,因为该connect方法具有:pool密钥,并且cliki在使用with-database. 我找不到在线使用的示例,我真的不确定我是否正确使用它。

目前我做这样的事情:

(defvar connection-string '("localhost" "database" "user" "password"))
(loop repeat 4 do (clsql:connect connection-string :pool t :database-type :mysql))

(defun called-on-seperate-thread (the-query)
  (clsql:with-database (db connection-string :pool t :database-type :mysql)
    (clsql:query the-query :database db)))

但 4 个数据库连接中只有 2 个被使用。我已经运行我的应用程序大约一周了,它似乎是 cliki 建议的线程安全的,但我不确定我能证明它,我很困惑为什么它只使用我的一些连接当它应该从池中随机选择它们时。

如何在 clsql 中正确使用连接池?

4

1 回答 1

0

这是 的:pool关键字参数的描述clsql:connect,取自https://www.quicklisp.org/beta/UNOFFICIAL/docs/clsql/doc/connect.html

一个布尔标志。如果为 T,则从打开的连接池中获取连接。如果池为空,则创建一个新连接。默认值为 NIL。

https://quickref.common-lisp.net/clsql.html上,据说:

如果 POOL 为 t,则连接将从通用池中获取,如果 POOL 是 CONN-POOL 对象,则连接将从该池中获取。

我想这意味着当你这样做时

(loop repeat 4 do (clsql:connect connection-string :pool t :database-type :mysql))

只有第一个调用返回一个新连接;第二、第三和第四次调用clsql:connect仅返回在第一次迭代中创建的连接,该连接位于“通用池”上。

虽然我没有测试它,但我想如果你传递nil参数:pool,所有四个连接实际上都会建立。

于 2020-06-09T02:31:49.960 回答