SpringBoot配置Mysql连接参数
1.SpringBoot默认支持如下数据源
- 1.com.zaxxer.hikari.HikariDataSource(SpringBoot2.0以上,默认使用此数据源)
- 2.org.apache.tomcat.jdbc.pool.DataSource
- 3.org.apache.commons.dbcp2.BasicDataSource
spring:
# 数据源配置
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: fasodifowe
url: jdbc:mysql://1.1.1.1:3306/database1?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8%useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true&Reconnect=true&failOverReadOnly=false
pom.xml中添加
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
部分常用连接参数解释
Mysql8.0以上版本的数据库连接有所不同:
- jar包使用mysql-connector-java-8.0.16.jar
- com.mysql.jdbc.Driver更改为com.mysql.cj.jdbc.Driver
多数据源配置与使用
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
- 配置多数据源
spring:
datasource: #数据库链接相关配置
dynamic:
druid: #以下是全局默认值,可以全局更改
#监控统计拦截的filters
filters: stat
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
stat:
merge-sql: true
log-slow-sql: true
slow-sql-millis: 2000
primary: A
datasource:
A:
url: jdbc:mysql://192.168.1.118:3306/dev_ops_aa?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true&autoReconnect=true&failOverReadOnly=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
B:
url: jdbc:mysql://192.168.1.118:3306/dev_ops_bb?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true&autoReconnect=true&failOverReadOnly=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
C:
url: jdbc:mysql://192.168.1.118:3306/dev_ops_cc?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true&autoReconnect=true&failOverReadOnly=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
- 多数据源使用
//不加@DS 表示使用默认的数据库,即 A
@Service
public class TeacherServiceImpl {
public boolean addTeacherWithTx(String name, Integer age) {
return teacherMapper.addTeacher(name, age);
}
}
//加在**ServiceImpl实现类上:表示这个类都使用B数据源
@Service
@DS(B)
public class TeacherServiceImpl extends ** implements ** {
public boolean addTeacherWithTx(String name, Integer age) {
return teacherMapper.addTeacher(name, age);
}
}
//加在实现类的方法上,表示这个方法使用C数据源
@Service
public class TeacherServiceImpl extends ** implements ** {
@DS(C)
public boolean sel**(String name, Integer age) {
return teacherMapper.sel**(name, age);
}
}
//加在某个mapper的get**的语句上,表示使用C数据源
@Mapper
public interface **Mapper extends BaseMapper<**> {
@DS(C)
@Select(SELECT COUNT(1) +
FROM sys_file_log +
WHERE del_flag = FALSE +
AND do_status = 3 +
AND bus_date = #{dateStr})
int get**(@Param(dateStr) String dateStr);
}
使用jdbc:mysql:replication读写分离
spring:
# 数据源配置
datasource:
#还没有测试mysql8是否支持,若不支持就退回 com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
#这个配置需要保证所有mysql的账户和密码一致
url: jdbc:mysql:replication://192.168.1.118:3306,192.168.1.119:3306,192.168.1.120:3306/dev_ops_aa?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true&autoReconnect=true&failOverReadOnly=false
username: root
password: 123456
#数据库连接池配置
hikari:
##等待从连接池中获得连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
connection-timeout: 30000
##一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
idle-timeout: 600000
##一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上
max-lifetime: 1765000
pool-name: slave
maximum-pool-size: 50
- url解释:master库为第一个ip(为主从数据库中的主库),slave库为后面的多个ip(为主从数据库的从库)
- @Transactional 默认的readOnly参数是false,更新操作不需要特别的改动。propagation是指的事务传播方式,默认设置是Require,指的是“本次操作需要事务支持,如果没有事务开启一个事务,如果有事务,加入到该事务中
@Transactional (propagation=Propagation.REQUIRED, readOnly = true )
public OrderBase getOrder(String orderCode) {
findSubOrderList(orderCode);
}
@Transactional (propagation=Propagation.REQUIRED, readOnly = true )
public List<OrderSub> findSubOrderList(String orderCode) {
}
@Transactional (propagation=Propagation.REQUIRED, readOnly = false )
public void updateOrder(OrderBase orderBase) {
findSubOrderList(orderBase.getCode());
- 1、当外部调用getOrder时,getOrder方法的@Transaction(readOnly = true 只读 )注解生效,设置从库查询。
- 2、当外部调用updateOrder时,updateOrder方法的@Transaction(readOnly = false 不是只读)注解生效,设置操作主库。
注意:这两个方法都调用了findSubOrderList方法,而调用的对象是this,不是被spring事务管理器替换过的service对象,所以findSubOrderList方法上的@Transaction注解无效,会根据上文环境来查主库和从库
这种特性对于业务来说是恰当好处的,生效的事务是在最外层的方法上,可以避免在一个事务内部出现读写库不统一的情况
使用jdbc:mysql:loadbalance负载均衡
spring:
# 数据源配置
datasource:
#还没有测试mysql8是否支持,若不支持就退回 com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
#这个配置需要保证所有mysql的账户和密码一致
url: jdbc:mysql:loadbalance://192.168.1.119:3306,192.168.1.119:3306,192.168.1.120:3306/dev_ops_aa?roundRobinLoadBalance=true&failOverReadOnly=false&tcpRcvBuf=1024000&loadBalanceStrategy=bestResponseTime&loadBalanceBlacklistTimeout=300000&loadBalancePingTimeout=1000&selfDestructOnPingMaxOperations=200&queryTimeoutKillsConnection=true&loadBalanceValidateConnectionOnSwapServer=true&connectTimeout=1000&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&allowMultiQueries=true&useOldAliasMetadataBehavior=true&autoReconnect=true&failOverReadOnly=false
username: root
password: 123456
#数据库连接池配置
hikari:
##等待从连接池中获得连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
connection-timeout: 30000
##一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
idle-timeout: 600000
##一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上
max-lifetime: 1765000
pool-name: slave
maximum-pool-size: 50
url参数解释