springboot多个数据库配置

多个redis数据库

多个redis配置的基类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package com.jianganwei.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;

import java.lang.reflect.Method;

/**
* spring-boot-data-packing 设置Redis多实例的基类
*
* @Author jianganwei
* @Date 2018/8/13
*/
@EnableCaching
@Configuration
public class RedisConfig {
@Value("${spring.redis.pool.max-active}")
private int redisPoolMaxActive;

@Value("${spring.redis.pool.max-wait}")
private int redisPoolMaxWait;

@Value("${spring.redis.pool.max-idle}")
private int redisPoolMaxIdle;

@Value("${spring.redis.pool.min-idle}")
private int redisPoolMinIdle;

/**
* 配置Key的生成方式
*
* @return
*/
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(o.getClass().getName())
.append(method.getName());
for (Object object : objects) {
stringBuilder.append(object.toString());
}
return stringBuilder.toString();
}
};
}
/**
* 创建redis连接工厂
*
* @param dbIndex
* @param host
* @param port
* @param password
* @param timeout
* @return
*/
public JedisConnectionFactory createJedisConnectionFactory(int dbIndex, String host, int port, String password, int timeout) {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setDatabase(dbIndex);
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setPassword(password);
jedisConnectionFactory.setTimeout(timeout);
jedisConnectionFactory.setPoolConfig(setPoolConfig(redisPoolMaxIdle, redisPoolMinIdle, redisPoolMaxActive, redisPoolMaxWait, true));
return jedisConnectionFactory;

}
/**
* 设置连接池属性
*
* @param maxIdle
* @param minIdle
* @param maxActive
* @param maxWait
* @param testOnBorrow
* @return
*/
public JedisPoolConfig setPoolConfig(int maxIdle, int minIdle, int maxActive, int maxWait, boolean testOnBorrow) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxWaitMillis(maxWait);
poolConfig.setTestOnBorrow(testOnBorrow);
return poolConfig;
}
/**
* 设置RedisTemplate的序列化方式
*
* @param redisTemplate
*/
public void setSerializer(RedisTemplate<Object,Object> redisTemplate) {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);

redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
}
/**
* 设置RedisTemplate的序列化方式
*
* @param redisTemplate
*/
public void setSerializerNomal(RedisTemplate redisTemplate) {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//设置键(key)的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置值(value)的序列化方式
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
}
}

redis数据库配置

redis数据库的配置,第二个第三个类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.jianganwei.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
* @program: Bemoan
* @description:
* @author: jianganwei
* @create: 2018-11-28 17:19
**/
@Configuration
public class BemoanRedisConfig extends RedisConfig {
@Value("${spring.redis.bemoan.database}")
private int dbIndex;

@Value("${spring.redis.bemoan.host}")
private String host;

@Value("${spring.redis.bemoan.port}")
private int port;

@Value("${spring.redis.bemoan.timeout}")
private String password;

@Value("${spring.redis.bemoan.timeout}")
private int timeout;
/**
* 配置redis连接工厂
*
* @return
*/
@Primary
@Bean
public RedisConnectionFactory cacheRedisConnectionFactory() {
return createJedisConnectionFactory(dbIndex, host, port, password, timeout);
}

/**
* 配置redisTemplate 注入方式使用@Resource(name="") 方式注入
*
* @return
*/
@Bean(name = "bemoanRedis")
public RedisTemplate<Object,Object> bemoanRedis() {
RedisTemplate<Object,Object> template = new RedisTemplate<Object,Object>();
template.setConnectionFactory(cacheRedisConnectionFactory());
setSerializer(template);
template.afterPropertiesSet();
return template;
}
/**
* 配置redisTemplate 注入方式使用@Resource(name="") 方式注入
*
* @return
*/
@Bean(name = "bemoanStringRedis")
public StringRedisTemplate stringRedisTemplate() {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(cacheRedisConnectionFactory());
setSerializerNomal(template);
template.afterPropertiesSet();
return template;
}
}

多个mysql数据库配置

配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.jianganwei.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import tk.mybatis.spring.annotation.MapperScan;

import javax.sql.DataSource;

/**
* @program: Bemoan
* @description: 个人数据库配置
* @author: jianganwei
* @create: 2018-11-29 09:43
**/
@Configuration
@MapperScan(basePackages = "com.jianganwei.mapper.person",sqlSessionFactoryRef = "personSqlSessionFactory")
public class PersonDataSourceConfig {
@Bean("personDataSource")
@ConfigurationProperties(prefix = "spring.datasource.person")
public DataSource personDataSource(){
return DataSourceBuilder.create().build();
}
@Bean("personSqlSessionFactory")
public SqlSessionFactory personSqlSessionFactory(@Qualifier("personDataSource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean();
org.apache.ibatis.session.Configuration configuration=new org.apache.ibatis.session.Configuration();
configuration.setUseGeneratedKeys(true);
factoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath:/xml/*.xml"));
configuration.setMapUnderscoreToCamelCase(true);
factoryBean.setFailFast(true);
return factoryBean.getObject();
}
@Bean("personTransactionManager")
public DataSourceTransactionManager personTransactionManager(@Qualifier("personDataSource") DataSource dataSource){
DataSourceTransactionManager manager=new DataSourceTransactionManager();
manager.setDataSource(dataSource);
return manager;
}
@Bean
public SqlSessionTemplate personSqlTemplate(@Qualifier("personDataSource") DataSource dataSource)throws Exception{
return new SqlSessionTemplate(personSqlSessionFactory(dataSource));
}
}

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring.datasource.person.driver-class-name: com.mysql.jdbc.Driver
spring.datasource.person.url: jdbc:mysql://.mysql.rds.aliyuncs.com/jianganwei_
spring.datasource.person.username: jianganwei
spring.datasource.person.password: J_anwei_2017
spring.datasource.person.type: com.alibaba.druid.pool.DruidDataSource
spring.datasource.person.initialSize: 5
spring.datasource.person.minIdle: 5
spring.datasource.person.maxIdle: 100
spring.datasource.person.maxActive: 200
spring.datasource.person.maxWait: 5000
spring.datasource.person.testOnBorrow: false
spring.datasource.person.validationQuery: SELECT 1
spring.datasource.person.testWhileIdle: true
spring.datasource.person.timeBetweenEvictionRunsMillis: 30000
spring.datasource.person.minEvictableIdleTimeMillis: 1800000
spring.datasource.person.numTestsPerEvictionRun: 100