目前Spring Boot支持的数据源包括tomcat, hikari,dbcp2。
SpringBoot 1 默认使用的连接池是tomcat数据源,
SpringBoot2 默认使用的连接池是hikari数据源。
SpringBoot 会根据依赖存在与否按优先级选择数据源。
以SpringBoot2 为例来说就是,找到hikari数据源则使用hikari,否则查找tomcat数据源、如果tomcat不存在、就查找dbcp2数据源
1.class com.zaxxer.hikari.HikariDataSource connectionInitSql
2.class org.apache.tomcat.jdbc.pool.DataSource initSQL
3.class org.apache.commons.dbcp2.BasicDataSource connectionInitSqls
上述数据源中,tomcat和hikari数据库连接池的init sql配置都是 connection-init-sql,dbcp2支是 connection-init-sqls 配置。
经过测试:
- init-SQL 配置的sql不支持多条,否者报错
- connection-init-sql 配置的sql不支持多条,否者报错
- connection-init-sqls 配置的sql会被解析成数组,保存到
如果init-sql需要多条,则需要使用dbcp2,配置示例如下:
先上正确配置:
spring:
datasource:
verify:
url: jdbc:mysql://localhost:3306/test
username: test
password: test1234
driver-class-name: com.mysql.jdbc.Driver
test-while-idle: true
validation-query: SELECT 1
connection-init-sqls:
- set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
- set names utf8mb4;
上面是使用了yml的数组配置方式,对yml不熟悉的同学可能会在一条字符串中配置 多条sql,如下图所示,在SpringBoot中如果没有特殊定义类型解析器。SpringBoot会使用逗号","来分割字符串,对于上例
“sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';”
sql中即包含逗号的情况,回导致sql被分割成多条sql,执行出错。只有当sql中不包含逗号时才可以正常执行。所以建议使用YML的数组配置方式进行配置。
具体参考解析方式参考 org.springframework.boot.convert.DelimitedStringToCollectionConverter#convert(java.lang.String, org.springframework.core.convert.TypeDescriptor, org.springframework.core.convert.TypeDescriptor)
YML的对各种数据类型的配置方式可参考另一篇文章: (待补充)
spring:
datasource:
verify:
url: jdbc:mysql://localhost:3306/test
username: test
password: test1234
driver-class-name: com.mysql.jdbc.Driver
test-while-idle: true
validation-query: SELECT 1
connection-init-sqls: set names utf8mb4;,select 1;
网友评论