【发布时间】:2017-08-28 17:46:46
【问题描述】:
我最近在我的数据库测试程序中实现了 C3P0(我正在使用它来测试对不同数据库格式的数据的不同查询...... sqlite、mariadb 等)。该程序最初是使用单个持续连接来执行所有查询的。这适用于 SQLite,因为我必须在另一个表上执行初始 ATTACH。当移动到需要在每个查询上打开和关闭连接的 C3P0 时,如何发出 ATTACH 命令并将其应用于后续查询?在我的失败中,我确实注意到附加后的第一个查询似乎适用。
对于每个查询,我真的需要将 ATTACH 测试作为 TESTDB 交错吗???
在使用 setCatalog() for MariaDB 时遇到类似问题。在第一个查询之后,我会为每个后续查询获得“未选择数据库”。
【问题讨论】:
-
不必为每个查询打开和关闭一个连接,您需要为每个工作单元打开和关闭一个连接。为了更好地理解你在做什么,你真的应该展示一些代码或你在做什么的大纲,因为这听起来有点像 XY 问题。据我了解,
ATTACH将向当前连接添加另一个数据库(不仅仅是一个表!),这可能首先表明您的设计存在问题。 -
你好,马克。参考我之前的帖子,我的程序是一个生产者/消费者,中间有一个队列,所以从这个意义上说,查询是一个工作单元。如果不将其设为全局变量,我将无法维持连接,对于 c3p0,我被告知我不应该这样做。你有更好的建议吗?
-
我想知道为什么你需要附加不同的数据库,这是否表明你需要为每个数据库使用一个连接池。我不明白为什么生产者消费者设置需要多个数据库,所以我希望尽可能详细。还要记住,问题应该是独立的,但如果您认为它提供了上下文,至少添加一个指向您之前的问题的链接(尽管我认为这还不够)。
-
您可以考虑查看 C3P0 的连接定制器,请参阅 mchange.com/projects/c3p0/#connection_customizers 不确定它是否对您的情况有用:我从来不需要这个,我认为我不完全了解你的问题。
-
... 但如果“原始源数据库”对于每种连接类型(SQLite、MariaDB、...)总是相同的,那么您可以尝试@MarkRotteveel 建议的 connection_customizers 方法,或者您可以创建自己的方法从池中获取连接,检查模式是否存在(对于 SQLite)或当前目录是否合适(对于 MariaDB),然后在返回连接对象之前根据需要进行调整。然而,有人可能会争辩说,它有点违背了连接池的目的。