or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

auto-configuration.mdconfiguration-properties.mddatasource-management.mdfilter-configuration.mdindex.mdmonitoring-integration.md

datasource-management.mddocs/

0

# DataSource Management

1

2

The Druid Spring Boot Starter provides DataSource creation, configuration, and lifecycle management through wrapper classes and builder patterns.

3

4

## Capabilities

5

6

### DruidDataSourceWrapper

7

8

A Spring Boot-integrated wrapper around DruidDataSource that provides automatic property binding and initialization.

9

10

```java { .api }

11

/**

12

* Spring Boot wrapper for DruidDataSource with automatic configuration

13

* Extends DruidDataSource and implements InitializingBean for lifecycle management

14

*/

15

@ConfigurationProperties("spring.datasource.druid")

16

public class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean {

17

18

/**

19

* Initializes the DataSource after all properties are set

20

* Falls back to basic Spring Boot DataSource properties when Druid-specific properties are not set

21

* Calls DruidDataSource.init() to complete initialization

22

* @throws Exception if initialization fails

23

*/

24

void afterPropertiesSet() throws Exception;

25

26

/**

27

* Automatically registers available Druid filters with the DataSource

28

* @param filters List of Filter beans to be added to the DataSource

29

*/

30

@Autowired(required = false)

31

void autoAddFilters(List<Filter> filters);

32

33

/**

34

* Sets maximum evictable idle time with validation bypass

35

* Bypasses IllegalArgumentException for configuration order issues

36

* @param maxEvictableIdleTimeMillis Maximum idle time in milliseconds

37

*/

38

void setMaxEvictableIdleTimeMillis(long maxEvictableIdleTimeMillis);

39

}

40

```

41

42

**Key Features:**

43

44

- **Property Binding**: Automatically binds properties with prefix `spring.datasource.druid`

45

- **Fallback Configuration**: Uses standard Spring Boot DataSource properties when Druid-specific ones aren't set

46

- **Filter Auto-Registration**: Automatically adds any Druid Filter beans found in the Spring context

47

- **Validation Workaround**: Handles property validation edge cases for better Spring Boot integration

48

49

**Usage Example:**

50

51

The wrapper is typically created automatically by the auto-configuration, but you can also create it manually:

52

53

```java

54

@Bean

55

@ConfigurationProperties("spring.datasource.druid.primary")

56

public DruidDataSourceWrapper primaryDataSource() {

57

return new DruidDataSourceWrapper();

58

}

59

```

60

61

### DruidDataSourceBuilder

62

63

Builder pattern utility for creating DruidDataSource instances, particularly useful for multiple DataSource configurations.

64

65

```java { .api }

66

/**

67

* Builder utility for creating DruidDataSource instances

68

* Provides fluent API for DataSource creation

69

*/

70

public class DruidDataSourceBuilder {

71

72

/**

73

* Creates a new DruidDataSourceBuilder instance

74

* @return New builder instance

75

*/

76

static DruidDataSourceBuilder create();

77

78

/**

79

* Builds a new DruidDataSourceWrapper instance

80

* @return Configured DruidDataSourceWrapper ready for use

81

*/

82

DruidDataSource build();

83

84

/**

85

* @deprecated Legacy method for Spring Boot 1.x compatibility

86

* Builds DruidDataSource with environment-specific configuration

87

* Fixed property ordering issues in older Spring Boot versions

88

* @param env Spring Environment for property resolution

89

* @param prefix Configuration property prefix

90

* @return Configured DruidDataSource

91

*/

92

@Deprecated

93

DruidDataSource build(Environment env, String prefix);

94

}

95

```

96

97

**Usage Examples:**

98

99

**Single DataSource:**

100

```java

101

@Bean

102

public DataSource dataSource() {

103

return DruidDataSourceBuilder.create().build();

104

}

105

```

106

107

**Multiple DataSources:**

108

```java

109

@Configuration

110

public class MultiDataSourceConfig {

111

112

@Primary

113

@Bean

114

@ConfigurationProperties("spring.datasource.druid.primary")

115

public DataSource primaryDataSource() {

116

return DruidDataSourceBuilder.create().build();

117

}

118

119

@Bean

120

@ConfigurationProperties("spring.datasource.druid.secondary")

121

public DataSource secondaryDataSource() {

122

return DruidDataSourceBuilder.create().build();

123

}

124

}

125

```

126

127

### Property Resolution Logic

128

129

The DruidDataSourceWrapper follows a specific property resolution hierarchy:

130

131

1. **Druid-specific properties** (e.g., `spring.datasource.druid.username`)

132

2. **Standard Spring Boot properties** (e.g., `spring.datasource.username`) as fallback

133

134

```java { .api }

135

/**

136

* Property resolution order in afterPropertiesSet():

137

* 1. Check if Druid-specific property is set

138

* 2. If not, fall back to standard Spring Boot DataSource property

139

* 3. Apply the resolved value to the DruidDataSource

140

*/

141

void afterPropertiesSet() throws Exception {

142

if (super.getUsername() == null) {

143

super.setUsername(basicProperties.determineUsername());

144

}

145

if (super.getPassword() == null) {

146

super.setPassword(basicProperties.determinePassword());

147

}

148

// ... similar for URL and driver class name

149

init(); // Complete DruidDataSource initialization

150

}

151

```

152

153

### Filter Integration

154

155

The wrapper automatically integrates with Druid's filter system:

156

157

```java { .api }

158

/**

159

* Automatic filter registration

160

* Any Filter beans in the Spring context are automatically added to the DataSource

161

* Supports conditional filter registration based on configuration

162

*/

163

@Autowired(required = false)

164

public void autoAddFilters(List<Filter> filters) {

165

super.filters.addAll(filters);

166

}

167

```

168

169

**Supported Filter Types:**

170

- StatFilter (SQL execution statistics)

171

- WallFilter (SQL injection protection)

172

- ConfigFilter (Encrypted password support)

173

- EncodingConvertFilter (Character encoding conversion)

174

- Slf4jLogFilter, Log4jFilter, Log4j2Filter, CommonsLogFilter (Logging integration)

175

176

### Multiple DataSource Configuration

177

178

For applications requiring multiple DataSources, configure separate property prefixes:

179

180

**Properties Configuration:**

181

```properties

182

# Primary DataSource

183

spring.datasource.druid.primary.url=jdbc:mysql://localhost:3306/primary

184

spring.datasource.druid.primary.username=primary_user

185

spring.datasource.druid.primary.password=primary_pass

186

spring.datasource.druid.primary.initial-size=5

187

spring.datasource.druid.primary.max-active=20

188

189

# Secondary DataSource

190

spring.datasource.druid.secondary.url=jdbc:mysql://localhost:3306/secondary

191

spring.datasource.druid.secondary.username=secondary_user

192

spring.datasource.druid.secondary.password=secondary_pass

193

spring.datasource.druid.secondary.initial-size=3

194

spring.datasource.druid.secondary.max-active=10

195

```

196

197

**Java Configuration:**

198

```java

199

@Configuration

200

public class DataSourceConfig {

201

202

@Primary

203

@Bean(name = "primaryDataSource")

204

@ConfigurationProperties("spring.datasource.druid.primary")

205

public DataSource primaryDataSource() {

206

return DruidDataSourceBuilder.create().build();

207

}

208

209

@Bean(name = "secondaryDataSource")

210

@ConfigurationProperties("spring.datasource.druid.secondary")

211

public DataSource secondaryDataSource() {

212

return DruidDataSourceBuilder.create().build();

213

}

214

}

215

```

216

217

### Lifecycle Management

218

219

The DruidDataSourceWrapper properly integrates with Spring's bean lifecycle:

220

221

1. **Construction**: Bean is created with default values

222

2. **Property Injection**: Spring injects configured properties

223

3. **afterPropertiesSet()**: Fallback properties are applied and DruidDataSource is initialized

224

4. **Bean Ready**: DataSource is ready for dependency injection and use

225

5. **Destruction**: Spring handles cleanup when application context closes