基于架构的多租户:不时获取"java.sql.SQLException: No database selected"



我的代码是用Java编写的,我使用Spring JDBC模板访问MySQL数据库。

我的系统是一个多租户,每个租户在MySQL中都有自己的专用模式(例如"tenant_1","tenant_2"等(。

以下是初始化数据库连接的方式:

在引导过程中,我创建了一个公开 DataSourceTransactionManager 的 Bean,该 Bean 由配置了 MySQL 数据库的连接字符串(未指定模式(的 DataSource 初始化。

由于我的系统是多租户的,因此对于每个请求,我都必须选择给定租户的架构。因此,典型的查询如下所示:

  1. "使用tenant_xxx">
  2. ....

问题:

不时(1到数千次处决(,我得到

java.sql.SQLException:未选择数据库。

我仔细检查了我的代码 - 事实上,我总是在查询执行之前选择模式。

有什么想法吗?

  • 春季 - 最新版本 (5.x(
  • 爪哇 - 11
  • MySQL (5.7(,在本地 MySQL 和 AWS Aurora 上复制

更新:添加更多信息

  • 我使用Spring Boot,默认情况下使用HikariCP
  • 我在代码中的随机位置注意到了这个问题,因此很可能它不是代码中特定位置的错误

更新 2:

  • 连接器/J 版本 8.0

有很多事情可能会出错,我将尝试提供一般想法,希望其中一些会有用。

因此,给定信息:

  1. 一般的想法。尝试记录 sql 请求,以便在发生错误时,您将看到它是否始终是相同的请求/请求类型(导致代码某些特定区域的错误(或不

  2. 检查您的连接池。您尚未指定实际的池,但从问题中可以清楚地看出它不是"自我教育"项目或其他东西,因此您可能有一个。 有时,它们在尝试处理多租户环境时会遇到 bug。

  3. 检查在查询中添加架构名称的方法(如果适用(,驱动程序中可能存在错误或其他内容(不太可能(。我的意思是,而不是

USE XYZ
select * from foo

你可以使用

select from xyz.foo

如果您有连接池的配置内容,请提供。

听起来连接池正在USE和后续的 DDL/DML 语句之间切换连接。

另外,有没有办法将数据库分配给池条目,反之亦然?

相关内容

  • 没有找到相关文章

最新更新