clsql似乎支持连接池,因为connect方法有:pool键,并且克里基注意到它在使用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中的连接池?
发布于 2020-06-09 02:31:49
这是对:pool关键字参数clsql:connect的描述,取自https://www.quicklisp.org/beta/UNOFFICIAL/docs/clsql/doc/connect.html
布尔标志。如果是T,则从打开的连接池中获取连接。如果池为空,则创建一个新连接。默认为零。
在https://quickref.common-lisp.net/clsql.html上,有人说:
如果池不是,则连接将从普通池中提取,如果池是CONN池对象,则连接将从此池中提取。
我想这意味着当你
(loop repeat 4 do (clsql:connect connection-string :pool t :database-type :mysql))只有第一个调用返回一个新连接;对clsql:connect的第二个、第三个和第四个调用只返回在第一个迭代中创建的连接,该连接位于“通用池”上。
虽然我没有测试它,但我想如果您将nil传递给:pool参数,那么所有四个连接实际上都会建立起来。
https://stackoverflow.com/questions/62104574
复制相似问题