我的代码是用Java编写的,我使用Spring JDBC模板来访问MySQL数据库。
我的系统是一个 Multi-Tenancy 系统,每个租户在 MySQL 中都有自己的专用架构(例如“tenant_1”、“tenant_2”等)。
这就是数据库连接的初始化方式:
在引导期间,我创建了一个公开 DataSourceTransactionManager 的 bean ,由配置了MySQL数据库连接字符串的DataSource初始化(不指定schema)。
由于我的系统是 Multi-Tenancy 的,因此对于每个请求,我必须选择给定租户的架构。因此,典型的查询如下所示:
- “使用tenant_xxx”
- ...
问题:
有时(1 到数千次执行),我会得到
java.sql.SQLException: No database selected.
我仔细检查了我的代码 - 事实上,我总是在查询执行之前选择架构。
有什么想法吗?
- Spring - 最新版本 (5.x)
- Java - 11
- MySQL (5.7),在本地 MySQL 和 AWS Aurora 上复制
更新:添加更多信息
- 我使用 Spring Boot,默认情况下使用 HikariCP
- 我在代码中的随机位置注意到了该问题,因此很可能这不是我的代码中的特定位置的错误
更新2:
- 连接器/J 版本 8.0
最佳答案
有很多事情可能会出错,我会尽力提供一般性想法,希望其中一些有用。
因此,鉴于信息:
一般想法。尝试记录 sql 请求,以便当错误发生时,您将看到它是否始终是相同的请求/请求类型(导致代码的某些特定区域出现错误的东西)。
检查您的连接池。您尚未指定实际的池,但从问题中可以清楚地看出,它不是一个“自学”项目或其他项目,因此您可能有一个。 有时,他们在尝试处理 Multi-Tenancy 环境时会遇到错误。
检查在查询中添加架构名称的方法是否适用,也许驱动程序中存在错误或其他问题(不太可能)。我的意思是,而不是
USE XYZ
select * from foo
你可以使用
select from xyz.foo
关于java - 基于架构的 Multi-Tenancy : getting "java.sql.SQLException: No database selected" from time to time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59085753/