java - 基于架构的 Multi-Tenancy : getting "java.sql.SQLException: No database selected" from time to time

标签 java mysql spring spring-jdbc

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

我的系统是一个 Multi-Tenancy 系统,每个租户在 MySQL 中都有自己的专用架构(例如“tenant_1”、“tenant_2”等)。

这就是数据库连接的初始化方式:

在引导期间,我创建了一个公开 DataSourceTransactionManager 的 bean ,由配置了MySQL数据库连接字符串的DataSource初始化(不指定schema)。

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

  1. “使用tenant_xxx”
  2. ...

问题:

有时(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

最佳答案

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

因此,鉴于信息:

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

  2. 检查您的连接池。您尚未指定实际的池,但从问题中可以清楚地看出,它不是一个“自学”项目或其他项目,因此您可能有一个。 有时,他们在尝试处理 Multi-Tenancy 环境时会遇到错误。

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

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/

相关文章:

java - 模拟一个类(class)的私有(private)领域

java - JAXB 如何读取此 XML 文件?

PHP守护进程脚本

spring - 如何使用 Spring Integration 移入 GCP Storage 后从本地目录中删除文件

java - 使用 Struts2 和 hibernate 创建 Web 服务(SOAP 或 REST)

java - BeanNameAutoProxyCreator setBeanNames 正则表达式不起作用?

java - 读取文件: File name not working

java - 在图像中放置标记

java - 如何使用 MySQL 和 Java 在 JFreechart 数据集中返回多行

mysql - 字符串作为主键的性能损失?