我的代码是用Java编写的,我使用Spring JDBC模板访问MySQL数据库。
我的系统是一个多租户,每个租户在MySQL中都有自己的专用模式(例如"tenant_1","tenant_2"等(。
以下是初始化数据库连接的方式:
在引导过程中,我创建了一个公开 DataSourceTransactionManager 的 Bean,该 Bean 由配置了 MySQL 数据库的连接字符串(未指定模式(的 DataSource 初始化。
由于我的系统是多租户的,因此对于每个请求,我都必须选择给定租户的架构。因此,典型的查询如下所示:
- "使用tenant_xxx">
- ....
问题:
不时(1到数千次处决(,我得到
java.sql.SQLException:未选择数据库。
我仔细检查了我的代码 - 事实上,我总是在查询执行之前选择模式。
有什么想法吗?
- 春季 - 最新版本 (5.x(
- 爪哇 - 11
- MySQL (5.7(,在本地 MySQL 和 AWS Aurora 上复制
更新:添加更多信息
- 我使用Spring Boot,默认情况下使用HikariCP
- 我在代码中的随机位置注意到了这个问题,因此很可能它不是代码中特定位置的错误
更新 2:
- 连接器/J 版本 8.0
有很多事情可能会出错,我将尝试提供一般想法,希望其中一些会有用。
因此,给定信息:
-
一般的想法。尝试记录 sql 请求,以便在发生错误时,您将看到它是否始终是相同的请求/请求类型(导致代码某些特定区域的错误(或不
。 -
检查您的连接池。您尚未指定实际的池,但从问题中可以清楚地看出它不是"自我教育"项目或其他东西,因此您可能有一个。 有时,它们在尝试处理多租户环境时会遇到 bug。
-
检查在查询中添加架构名称的方法(如果适用(,驱动程序中可能存在错误或其他内容(不太可能(。我的意思是,而不是
USE XYZ
select * from foo
你可以使用
select from xyz.foo
如果您有连接池的配置内容,请提供。
听起来连接池正在USE
和后续的 DDL/DML 语句之间切换连接。
另外,有没有办法将数据库分配给池条目,反之亦然?