springboot mysql统一事务配置,压测出现问题

springboot+mysql进行统一事务配置,扫描service层
类似这种配置
private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.material_cloud.short_link.modules.service.impl..(..))";

产生事务(以save为开头的访问)
controller(a)----service(a)-------serviceImp(a)
这种访问方式无任何问题
controller(a)----service(b)-------serviceImp(b)
这种访问方式进行压测,并发超过7个时,即并发产生超过7个事务,在产生第7个事务后,java与mysql连接出现(druid连接)问题,任何访问都无效,重启服务器后(即重置druid连接池)后才能再访问,请问这是什么原因

数据库连接池的配置不合理导致的,可以尝试调整数据库连接池的配置,增加连接池的大小,或者调整连接池的其他参数,比如最大等待时间、最大空闲时间等

任何访问都无效,重启服务器后(即重置druid连接池)后才能再访问,那就说明你整个逻辑层调用是在一直产生连接的,导致把连接数消耗完了,就连不上了

  • 这篇博客: Springboot项目:mysql不支持存储表情符号的解决方法(druid连接池)中的 Springboot项目:mysql不支持存储表情符号的解决方法(druid连接池) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • 原因
    mysql数据库的默认字符集utf8,只能存储3个字节的数据,标准的emoji表情是4个字节,所以要使用utf8mb4兼容四个字节。

    解决方法

    1. 修改数据库的字符集
      先查看数据库的字符集属性,输入:

      show variables like '%character%';
      

      出现结果如图所示:
      mysql character属性
      将utf8改成uftmb4:

      set character_set_client = utf8mb4;
      set character_set_server = utf8mb4;
      set character_set_connection = utf8mb4;
      set character_set_database = utf8mb4;
      set character_set_results = utf8mb4;
      set collation_connection = utf8mb4_general_ci;
      set collation_database = utf8mb4_general_ci;
      set collation_server = utf8mb4_general_ci;
      
    2. 修改含有表情符号的字段编码类型为utf8mb4

      ALTER TABLE `表名` MODIFY COLUMN `字段名`  varchar(255) CHARACTER SET utf8mb4 NULL DEFAULT NULL COMMENT '注释';
      
    3. 修改对应的表的数据集

      ALTER TABLE `表名` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
      
    4. 更改数据库连接池配置
      1)直接在数据源的xml文件中设置连接初始化语句set names utf8mb4,以下是druid连接池的配置:

      <property name="connectionInitSqls" value="set names utf8mb4;"/>
      

      2)若为自己编写的数据源类,则进行如下配置:

      以我的项目为例:在DruidProperties.java(数据源配置类)中添加成员变量connectionInitSqls以及其setter getter函数,并在配置函数config()中添加dataSource.setConnectionInitSqls(Arrays.asList(connectionInitSqls));

      private String[] connectionInitSqls;
      
      public String[] getConnectionInitSqls() {
          return connectionInitSqls;
      }
      
      public void setConnectionInitSqls(String[] connectionInitSqls) {
          this.connectionInitSqls = connectionInitSqls;
      }
      
      public void config(DruidDataSource dataSource) {
      	...
          dataSource.setConnectionInitSqls(Arrays.asList(connectionInitSqls));
      	...
      }
      

      最后在配置文件application.yml中添加connection-init-sqls: set names utf8mb4,如图最后一行所示:application.yml

    注意:jdbc url连接参数characterEncoding=utf-8不变