Seata2.0使用Mysql8报错



注:
  只贴出来使用的nacos、mysql配置,其他的都是默认的。
  下载下来的是没有nacos和mysql的配置的,若需要在application.yml 的同级目录下的 application.example.yml 文件里复制过来修改。

修改前的配置

application.yml

文件位置:seata-server-2.0.0/conf/application.yml

seata:
  #配置中心
  config:
  	#配置中心类型,默认为file
    type: nacos
    #nacos配置中心配置信息
    nacos:
      #nacos服务地址
      server-addr: 127.0.0.1:8848
      #命名空间,默认为空也就是public
      namespace:
      #分组,默认为DEFAULT_GROUP
      group: SEATA_GROUP
      context-path:
      #指定配置中心的seata配置
      data-id: seata.yaml
  #注册中心
  registry:
  	#注册中心类型,默认为file
    type: nacos
    #nacos注册中心配置信息
    nacos:
      #指定注册到nacos注册中心的服务名
      application: seata-server
      #nacos服务地址
      server-addr: 127.0.0.1:8848
      #分组,默认为DEFAULT_GROUP
      group: SEATA_GROUP
      #命名空间,默认为空也就是public
      namespace:
      #指定注册至nacos注册中心的集群名
      cluster: default
      context-path:
#      #if use MSE Nacos with auth, mutex with username/password attribute
#      access-key:
#      secret-key:
  store:
  	#指定seata配置存放的位置,默认file,缓存
    mode: db
    #数据库连接信息
    db:
      datasource: druid
      #数据库类型
      db-type: mysql
      #数据库驱动
      driver-class-name: com.mysql.jdbc.Driver
      #数据库连接
      url: jdbc:mysql://localhost:3306/seata?useUnicode=true
      #数据库用户名
      user: mysql
      #数据库密码
      password: mysql
      #最小连接数
      min-conn: 10
      #最大连接数
      max-conn: 100
      #指定seata数据库的全局事务信息表,自动生成,默认即可
      global-table: global_table
      #指定seata数据库的分支信息(事务参与者信息)表,自动生成,默认即可
      branch-table: branch_table
      #指定seata数据库的全局锁表,自动生成,默认即可
      lock-table: lock_table
      #指定seata数据库的分布式锁表,自动生成,默认即可
      distributed-lock-table: distributed_lock
      #最大等待时间
      max-wait: 5000
  #  server:
  #    service-port: 8091 #If not configured, the default is '${server.port} + 1000'

seata.yml

文件位置:nacos访问页面的配置中心/seata.yml

#事务分组
#主要用于解决异地机房停电容错,可以快速切换事务分组。
#default_tx_group:配置事务的分组名称,可以自定义
#default:必须等于application.yml中 seata.registry.nacos.cluster=default
service:
    vgroupMapping:
        default_tx_group: default

store:
    mode: db
    lock:
        mode: db
    session:
        mode: db
    #数据库连接
    db:
        datasource: druid
        dbType: mysql
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/seata?useUnicode=true&rewriteBatchedStatements=true
        user: mysql
        password: mysql
        minConn: 5
        maxConn: 30
        globalTable: global_table
        branchTable: branch_table
        distributedLockTable: distributed_lock
        queryLimit: 100
        lockTable: lock_table
        maxWait: 5000

修改后的配置

application.yml

文件位置:seata-server-2.0.0/conf/application.yml

seata:
  #配置中心
  config:
  	#配置中心类型,默认为file
    type: nacos
    #nacos配置中心配置信息
    nacos:
      #nacos服务地址
      server-addr: 127.0.0.1:8848
      #命名空间,默认为空也就是public
      namespace:
      #分组,默认为DEFAULT_GROUP
      group: SEATA_GROUP
      context-path:
      #指定配置中心的seata配置
      data-id: seata.yaml
  #注册中心
  registry:
  	#注册中心类型,默认为file
    type: nacos
    #nacos注册中心配置信息
    nacos:
      #指定注册到nacos注册中心的服务名
      application: seata-server
      #nacos服务地址
      server-addr: 127.0.0.1:8848
      #分组,默认为DEFAULT_GROUP
      group: SEATA_GROUP
      #命名空间,默认为空也就是public
      namespace:
      #指定注册至nacos注册中心的集群名
      cluster: default
      context-path:
#      #if use MSE Nacos with auth, mutex with username/password attribute
#      access-key:
#      secret-key:
  store:
  	#指定seata配置存放的位置,默认file,缓存
    mode: db
    #数据库连接信息
    db:
      #数据源
      datasource: druid
      #数据库类型
      db-type: mysql
      #数据库驱动
      #mysql5.x:driverClassName: com.mysql.jdbc.Driver
      driverClassName: com.mysql.cj.jdbc.Driver
      #数据库连接
      #mysql5.x
      #url: jdbc:mysql://localhost:3306/seata?useUnicode=true
      #mysql8.x
      url: jdbc:mysql://localhost:3306/seata?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
      #数据库用户名
      user: mysql
      #数据库密码
      password: mysql
      #最小连接数
      min-conn: 10
      #最大连接数
      max-conn: 100
      #指定seata数据库的全局事务信息表,自动生成,默认即可
      global-table: global_table
      #指定seata数据库的分支信息(事务参与者信息)表,自动生成,默认即可
      branch-table: branch_table
      #指定seata数据库的全局锁表,自动生成,默认即可
      lock-table: lock_table
      #指定seata数据库的分布式锁表,自动生成,默认即可
      distributed-lock-table: distributed_lock
      #最大等待时间
      max-wait: 5000
  #  server:
  #    service-port: 8091 #If not configured, the default is '${server.port} + 1000'

seata.yml

文件位置:nacos访问页面的配置中心/seata.yml

#事务分组
#主要用于解决异地机房停电容错,可以快速切换事务分组。
#default_tx_group:配置事务的分组名称,可以自定义
#default:必须等于application.yml中 seata.registry.nacos.cluster=default
service:
    vgroupMapping:
        default_tx_group: default

store:
    mode: db
    lock:
        mode: db
    session:
        mode: db
    #数据库连接
    db:
        datasource: druid
        dbType: mysql
        #mysql5.x:driverClassName: com.mysql.jdbc.Driver
        driverClassName: com.mysql.cj.jdbc.Driver
        #mysql5.x
        #url: jdbc:mysql://localhost:3306/seata?useUnicode=true&rewriteBatchedStatements=true
        #mysql8.x
        url: jdbc:mysql://localhost:3306/seata?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
        user: mysql
        password: mysql
        minConn: 5
        maxConn: 30
        globalTable: global_table
        branchTable: branch_table
        lockTable: lock_table
        distributedLockTable: distributed_lock
        #查询条数
        queryLimit: 100
        #最大等待时间
        maxWait: 5000

修改前的报错:

1、启动Seata服务,报ssl验证失败

原因:mysql8需要关闭验证
解决方法:在mysql连接后加上useSSL=false,例如:

url: jdbc:mysql://localhost:3306/seata?useSSL=false

注:seata配置mysql连接不能用 | 连接,在业务服务中是可以的。

2、启动Seata服务,报Unknown system variable ‘query_cache_size’

原因:mysql8是没有这个配置的,驱动用的是com.mysql.jdbc.Driver驱动,在 seata-server-2.0.0\lib\jdbc 下的驱动,应该是为了兼容低版本的。

mysql-connector-java-5.1.42.jar
mysql-connector-java-8.0.27.jar

解决方法:
把驱动从 com.mysql.jdbc.Driver 改成 com.mysql.cj.jdbc.Driver

mysql连接属性参考

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: |
      #MySQL数据库链接
        jdbc:mysql://localhost:3306/test?
      #关闭安全验证,5.7版本以后必须加,之前的版本默认为false
        useSSL=false&
      #指定所处理字符解码的格式 
        useUnicode=true&
      #指定所处理字符编码的格式 
        characterEncoding=utf8&
      #指定时区
        serverTimezone=GMT%2B8&
      #允许客户端从服务器获取公钥,mysql8以后要添加,防止报错
        allowPublicKeyRetrieval=true&
      #mybatis允许多行sql执行
        allowMultiQueries=true&
      #打开批处理配置,对insert/update/delete有效,默认是false
        rewriteBatchedStatements=true&
      #Java把零值日期转换为null值
        zeroDateTimeBehavior=convertToNull
    username: mysql
    password: mysql
    maximum-pool-size:  5

nacos配置中心配置数据库连接参考

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: > 
      jdbc:mysql://localhost:3306/test?
      useSSL=false&
      useUnicode=true&
      characterEncoding=utf8&
      serverTimezone=GMT%2B8&
      allowPublicKeyRetrieval=true&
      allowMultiQueries=true&
      rewriteBatchedStatements=true&
      zeroDateTimeBehavior=convertToNull
    username: mysql
    password: mysql
    maximum-pool-size:  5

注:
  不能使用 | 连接
  不能使用 # 注释,会被编译

nacos配置中心自建seata配置

​ 访问nacos配置页面:http://localhost:8848/nacos/

​ 新建配置:

​   命名空间:public

​   Data ID:seata.yaml

​   Group:SEATA_GROUP

​   配置格式:yaml

注:也可以建properties文件,nacos配置中心默认就是properties文件,如果是properties文件时Data ID可以不需要后缀的文件扩展名,seata配置方便使用properties、txt,使用不同类型的时候seata不需要增加文件类型,只需要使用 application.ymlseata.config.nacos.data-id=seata.yaml 指定到nacos配置中心配置好的文件名称就好了。

总结

  还是有点尴尬的,我还以为默认的配置mysql8也可以使用,所以才开始就是用的默认配置,驱动也是看到他们说的seata的报错可能是没驱动,换了个驱动就好了。配置不写那么多注释了哈,参考就好,我能看懂的也不多,很多都很清晰。(◕ᴗ◕✿)

<think>好的,我现在要解决用户在Spring Cloud Alibaba项目中整合Sharding-JDBC后无法启动嵌入式Tomcat服务器的问题。首先,我需要回顾一下可能的原因。根据经验,这类问题通常与依赖冲突、配置错误或Bean初始化顺序有关。 首先,检查依赖冲突。用户提到使用的是Spring Boot 2.0.4.RELEASE,而Spring Cloud Alibaba的版本需要与之兼容。例如,Spring Cloud Alibaba 2.0.x应与Spring Boot 2.0.x兼容。如果Sharding-JDBC的版本过新,可能会引入与旧版Spring Boot不兼容的依赖,比如更高版本的Tomcat。这时候需要确认依赖树,是否存在Tomcat相关jar包的版本冲突。可以使用Maven的`mvn dependency:tree`命令查看,或者Gradle的依赖报告。 其次,配置问题。Sharding-JDBC的配置是否正确?比如数据源配置是否正确,分片规则是否合理。如果数据源配置错误,可能导致应用启动时初始化失败,进而导致Tomcat无法启动。另外,检查YAML或Properties文件中的语法是否正确,特别是缩进和特殊字符的处理。 Bean初始化顺序也是一个可能的因素。Spring Boot在启动时会初始化各种Bean,如果某些Bean(如数据源)在Tomcat初始化之后才加载,可能导致冲突。可能需要使用`@DependsOn`注解来明确Bean的依赖关系,或者调整自动配置的顺序。 另外,日志分析非常重要。用户应该查看启动时的异常堆栈信息,找出具体的错误原因。常见的错误如`BeanCreationException`、`NoSuchBeanDefinitionException`或者与Tomcat端口绑定失败相关的错误。例如,如果端口被占用,Tomcat自然无法启动,但这种情况通常会有明确的错误信息提示。 还有可能涉及到Spring Boot自动配置的问题。Sharding-JDBC可能需要自定义数据源的配置,而Spring Boot的自动配置可能会与之冲突。这时候可以尝试排除自动配置类,比如使用`@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})`,然后手动配置数据源。 此外,版本兼容性需要仔细核对。Spring BootSpring Cloud Alibaba、Sharding-JDBC以及Seata等组件的版本是否相互兼容。例如,Spring Cloud Alibaba 2.0.4.RELEASE对应的Spring Boot版本是2.0.x,而Sharding-JDBC的4.x版本可能需要更高版本的Spring Boot,这可能导致不兼容的问题。如果用户使用的是Sharding-JDBC 5.x,可能需要升级Spring Boot2.4.x或更高版本。 最后,考虑是否需要调整内存设置或JVM参数,尤其是在处理大型分库分表时,应用启动可能需要更多内存,否则可能在初始化过程中因内存不足而失败。 总结下来,解决步骤可能是:检查依赖冲突,确认版本兼容性,检查配置是否正确,分析启动日志,调整Bean初始化顺序,排除自动配置类,必要时升级或降级相关依赖版本。</think>### 解决Spring Cloud Alibaba整合Sharding-JDBC后无法启动Tomcat的步骤 #### 1. **检查依赖冲突** - **问题定位**: 版本不兼容是常见原因。例如,Sharding-JDBC的高版本可能依赖更高版本的Tomcat或Spring Boot,与当前项目冲突。 - **解决方案**: - 使用命令`mvn dependency:tree | findstr tomcat`(Windows)或`mvn dependency:tree | grep tomcat`(Linux/Mac)检查Tomcat依赖版本。若存在多个版本,需通过`<exclusions>`排除冲突依赖。 - 示例配置(Maven): ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> ``` - **引用支持**: Spring Boot的嵌入式Tomcat版本由父POM管理,版本冲突可能导致启动失败[^1]。 #### 2. **验证版本兼容性** - Spring Cloud Alibaba 2.0.x需匹配Spring Boot 2.0.x,而Sharding-JDBC 4.x支持Spring Boot 2.0.x。若使用Sharding-JDBC 5.x,需升级Spring Boot2.4+。 - 版本对照表示例: | 组件 | 兼容版本 | |--------------------|-------------------| | Spring Boot | 2.0.4.RELEASE | | Spring Cloud Alibaba| 2.0.x.RELEASE | | Sharding-JDBC | 4.1.1 | #### 3. **检查数据源配置** - **配置问题**: Sharding-JDBC的分片规则或数据源定义错误可能导致Bean初始化失败。 - **示例配置**(YAML): ```yaml spring: shardingsphere: datasource: names: ds0, ds1 ds0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db0 username: root password: root ds1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db1 username: root password: root sharding: tables: user: actualDataNodes: ds$->{0..1}.user_$->{0..1} ``` - **关键点**: 确保数据源名称与分片规则中的引用一致,避免`NullPointerException`。 #### 4. **分析启动日志** - **常见错误**: - `Port 8080 already in use`: 修改`server.port`。 - `BeanCreationException`: 检查数据源Bean是否正确注入。 - `NoSuchBeanDefinitionException`: 确认Sharding-JDBC配置的包路径是否被扫描。 #### 5. **调整自动配置顺序** - 若Spring Boot自动配置与Sharding-JDBC冲突,需手动排除自动配置类: ```java @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 6. **Seata分布式事务整合问题** - 若同时使用Seata,需确保`seata-spring-boot-starter`与当前版本兼容,并正确配置`undo_log`表[^3]。 - 示例Seata配置: ```yaml seata: enabled: true application-id: ${spring.application.name} tx-service-group: my_tx_group ``` #### 7. **升级或降级依赖** - 若上述步骤无效,尝试调整版本组合: ```xml <!-- 示例:降级Sharding-JDBC至兼容版本 --> <properties> <sharding.version>4.1.1</sharding.version> </properties> ``` ### 总结流程图 ```plaintext 开始 ├─ 检查依赖冲突 → 解决冲突后重启 ├─ 验证版本兼容性 → 调整版本后重启 ├─ 检查数据源配置 → 修正配置后重启 ├─ 分析启动日志 → 根据错误修复代码 ├─ 调整自动配置 → 排除冲突类后重启 └─ 升级/降级依赖 → 修改版本后重启 结束 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值