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连接池)后才能再访问,那就说明你整个逻辑层调用是在一直产生连接的,导致把连接数消耗完了,就连不上了
解决方法
修改数据库的字符集
先查看数据库的字符集属性,输入:
show variables like '%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;
修改含有表情符号的字段编码类型为utf8mb4
ALTER TABLE `表名` MODIFY COLUMN `字段名` varchar(255) CHARACTER SET utf8mb4 NULL DEFAULT NULL COMMENT '注释';
修改对应的表的数据集
ALTER TABLE `表名` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
更改数据库连接池配置
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
,如图最后一行所示:
注意:jdbc url连接参数characterEncoding=utf-8
不变