分布式的常见问题--数据库篇

java.sql.SQLException: Failed to fetch schema of "sql'

也就是表示在尝试获取数据库模式时出现了问题

分布式之外的常见情况是:

  1. 数据库连接问题:请检查数据库连接是否正常,确保已经正确配置了数据库URL、用户名和密码。
  2. 数据库不存在:请检查数据库名称是否正确,以及该数据库是否已经创建。
  3. 权限问题:请检查当前用户是否具有足够的权限来获取数据库模式。
  4. 网络问题:请检查网络连接是否正常,确保可以访问到数据库服务器。

但是这些不是难以发现的问题,我要说的是其他情况的解决方案::

一.数据库中缺少主键,恰巧使用了MybatisXPlus的方法去操作或生成了数据库;

添加一下数据库主键就好.如下:

二.使用@GlobalTransactional注解导致的返回类问题;

@GlobalTransactional 注解是 Spring Framework 提供的一个用于管理分布式事务的注解。

在使用 @GlobalTransactional 注解时,需要注意以下版本问题:

  1. Spring Framework 版本:@GlobalTransactional 注解是从 Spring Framework 5.1 版本开始引入的,因此需要使用 Spring Framework 5.1 及以上版本的应用程序才能使用该注解。如果你使用的是旧版本的 Spring Framework,可以考虑升级到最新版本。

  2. Spring Data JPA 版本:@GlobalTransactional 注解需要与 Spring Data JPA 配合使用,因此需要使用支持该注解的 Spring Data JPA 版本。目前,Spring Data JPA 2.2 及以上版本都支持 @GlobalTransactional 注解。

  3. Spring Boot 版本:如果你使用的是 Spring Boot,也需要确保使用的 Spring Boot 版本支持 @GlobalTransactional 注解。目前,Spring Boot 2.2 及以上版本都支持该注解。

  4. Spring Cloud 版本:如果你使用的是 Spring Cloud,也需要确保使用的 Spring Cloud 版本支持 @GlobalTransactional 注解。目前,Spring Cloud 2.2 及以上版本都支持该注解。

网上有些博主推荐的方法是:

@GlobalTransactional的Url里添加useInformationSchema=false ,以下是我截的图,

 但是,这有一个问题:

@GlobalTransactional注解的URL中添加useInformationSchema=false参数的作用是禁用信息模式。

信息模式是一种数据库模式,它提供了关于数据库表、列、索引等元数据的信息。当使用信息模式时,应用程序可以查询这些元数据以获取有关数据库结构的信息。然而,在某些情况下,应用程序可能不需要这些元数据,或者需要更细粒度的控制来访问数据库结构。

通过将useInformationSchema参数设置为false,应用程序将不再使用信息模式。这意味着应用程序将直接与数据库进行交互,而不是通过查询信息模式来获取元数据。这可以提高性能,因为不需要额外的查询操作。

需要注意的是,禁用信息模式可能会导致应用程序无法访问某些数据库功能或特性。因此,在使用此参数之前,请确保应用程序的需求和数据库支持该设置。

---------------------------------------------------------------------------------------------------------------------------------

Duplicate entry 'xxx' for key 'PRIMARY',其中'xxx'是试图插入的主键值

二.主键和外键冲突且值重复,无法修改添加;

解释就是:

主键和外键值冲突是指在数据库中,一个表中的主键值被另一个表的外键引用时,两个表中的主键值相同。这种情况通常发生在以下场景:

  1. 数据冗余:当两个表之间存在一对多或多对一的关系时,如果其中一个表的主键值被另一个表的外键引用,那么这两个表中的数据就会出现冗余。例如,一个订单表和一个订单明细表,订单表中的主键是订单ID,订单明细表中的外键是订单ID,如果两个表中都存在相同的订单ID,就会导致主键和外键值冲突。

  2. 更新操作:当一个表中的主键值被另一个表的外键引用时,如果对该主键值进行更新操作,就会影响到被引用的外键值。例如,将订单表中的某个订单ID从100改为200,那么所有引用该订单ID的外键值都会受到影响。

为了避免主键和外键值冲突的情况发生,可以采取以下措施:

  1. 设计合理的数据库结构:在设计数据库结构时,应该尽量避免出现数据冗余的情况,可以通过建立关联表或者使用联合查询等方式来减少数据冗余。

  2. 合理设置主键和外键:在设置主键和外键时,应该遵循一些原则,如主键应该是唯一的、不可重复的;外键应该是参照自增主键等。同时,也要注意避免出现不必要的外键关系。

  3. 使用事务控制:在进行更新操作时,可以使用事务控制来保证数据的一致性和完整性。通过将多个操作封装在一个事务中,可以确保这些操作要么全部成功,要么全部失败.

解决方法 :

 实在找不到头绪的时候,可以注释掉MybatisX自动生成的注解,或整改数据库的主键外键配置.

以上;

 

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值