привет~ С Новым годом, читатели!
Вспоминая, что когда несколько дней назад проект springboot был развернут на основную линию, для онлайн-среды требовался jdk7, но проект разрабатывался на основе jdk8, а springboot также использует springboot2 или выше.После кода онлайн-среды, конечно , вам нужно немного понять секрет, стоящий за этим.
Ну, он не много говорил, мы идем прямо к теме.
На самом деле переключение не слишком хлопотное, подводка в том, что после перехода с Spring Boot 2 на Spring Boot 1 пул соединений по умолчанию изменился, а предыдущий стресс-тест повторился.
Кажется, что вина отрицательная, я человек, полный положительной энергии, поэтому я резюмирую себя так: хотя я знаю, как это использовать, я не понимаю правду о технологии и делаю улун.
Далее давайте проверим источник данных по умолчанию, используемый SpringBoot2 и SpringBoot1!
1. HikariCP из SpringBoot2
- Во-первых, пакеты зависимостей, которые необходимо ввести в файл pom:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<mybatis.spring.boot.version>1.3.1</mybatis.spring.boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
- Во-вторых, в файле конфигурации необходимо определить следующие свойства (значение по умолчанию будет использоваться автоматически, если оно не определено):
# spring的相关配置
spring:
application:
name: HikariCP测试
# 数据源的配置
datasource:
# 连接池的配置
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 5
maximum-pool-size: 15
connection-test-query: SELECT 1
max-lifetime: 1800000
connection-timeout: 30000
pool-name: DatebookHikariCP
- После завершения настройки вы можете увидеть информацию о печати, подобную этой, при успешном запуске:
2020-01-16 16:23:12.911 INFO 9996 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2020-01-16 16:23:12.913 INFO 9996 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure
2020-01-16 16:23:12.924 INFO 9996 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2020-01-16 16:23:12.994 INFO 9996 --- [ main ] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 18001 (http) with context path ''
2020-01-16 16:23:13.002 INFO 9996 --- [ main ] c.j.mmzsblog.DatasourceTestApplication : Started DatasourceTestApplication in 6.724 seconds (JVM running for 8.883)
где строка 3[com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
В этой части указывается тип используемого пула соединений.
2. tomcat-jdbc SpringBoot1
После понижения версии я не увидел напечатанной вышеуказанной информации, и я почти не знал, какой пул соединений использовался, но интернет сказал, что это tomcat-jdbc; но я считаю, что увидеть значит поверить, я должен его напечатать где-то, чтобы быть уверенным, поэтому Почти, я сделал следующее:
Сделал контроллер для простого вывода информации о пуле соединений.
@RestController
public class testController {
@Resource
private DataSource dataSource;
@GetMapping("/query")
public void query(){
System.out.println("查询到的数据源连接池信息是:"+dataSource);
System.out.println("查询到的数据源连接池类型是:"+dataSource.getClass());
System.out.println("查询到的数据源连接池名字是:"+dataSource.getPoolProperties().getName());
}
}
Затем я увидел следующую информацию о печати, это действительно работаетtomcat-jdbc
查询到的数据源连接池信息是:org.apache.tomcat.jdbc.pool.DataSource@181d8899{ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; defaultTransactionIsolation=-1; defaultCatalog=null; driverClassName=com.mysql.jdbc.Driver; maxActive=100; maxIdle=100; minIdle=10; initialSize=10; maxWait=30000; testOnBorrow=true; testOnReturn=false; timeBetweenEvictionRunsMillis=5000; numTestsPerEvictionRun=0; minEvictableIdleTimeMillis=60000; testWhileIdle=false; testOnConnect=false; password=********; url=jdbc:mysql://localhost:3306/xxxxxx; username=xxxx; validationQuery=SELECT 1; validationQueryTimeout=-1; validatorClassName=null; validationInterval=3000; accessToUnderlyingConnectionAllowed=true; removeAbandoned=false; removeAbandonedTimeout=60; logAbandoned=false; connectionProperties=null; initSQL=null; jdbcInterceptors=null; jmxEnabled=true; fairQueue=true; useEquals=true; abandonWhenPercentageFull=0; maxAge=0; useLock=false; dataSource=null; dataSourceJNDI=null; suspectTimeout=0; alternateUsernameAllowed=false; commitOnReturn=false; rollbackOnReturn=false; useDisposableConnectionFacade=true; logValidationErrors=false; propagateInterruptState=false; ignoreExceptionOnPreLoad=false; useStatementFacade=true; }
查询到的数据源连接池类型是:class org.apache.tomcat.jdbc.pool.DataSource
查询到的数据源连接池名字是:Tomcat Connection Pool[1-1715657818]
На самом деле дверной проем мы можем увидеть и из pom-файла:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
Эта зависимость в файле зависимостей фактически указывает, что SpringBoot1 использует пул соединений tomcat-jdbc.
Эй, теперь я знаю, что база данных по умолчанию, используемая SpringBoot2.0 и SpringBoot1.0, отличается.
Теперь причина найдена, но как ее решить? В противном случае измените пул соединений по умолчанию для версии SpringBoot1, чтобы он совпадал с версией SpringBoot2. Ну, когда у вас есть идея, давайте начнем.
На самом деле пул соединений HikariCP можно использовать и в версии SpringBoot1.Операция такова:
- Конфигурация по умолчанию сначала вводится в источнике исключенных данных tomcat-jdbc.
<!--配置默认数据源 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<!-- 排除默认的tomcat-jdbc数据源 -->
<exclusion>
<groupId>org.apache</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引用SpringBoot2默认的HikariCP数据源 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.3.1</version>
</dependency>
- Переходные данные Hikaricp Источник данных ИНФОРМАЦИОННАЯ ИНФОРМАЦИЯ .YML
# spring的相关配置
spring:
# 数据源的配置
datasource:
# 连接池的配置
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 5
maximum-pool-size: 15
connection-test-query: SELECT 1
max-lifetime: 1800000
connection-timeout: 30000
Почему я хочу переключить источник данных на источник данных по умолчанию, используемый SpringBoot 2.0 здесь? Поскольку я использую источник данных tomcat-jdbc SpringBoot1.0, я боюсь, что тест давления не будет соответствовать требованиям, чтобы не увеличивать нагрузку на тест (я такой хороший человек)
Итак, я сделал вышеуказанную замену.
Но в этом определенно есть польза. Выгода заключается в захватывающих преимуществах HikariCP:
- 1. Оптимизация на уровне байт-кода (многие методы генерируются JavaAssist)
- 2. Множество мелких улучшений
- Замените ArrayList на FastStatementList
- коллекция без блокировки ConcurrentBag
- Оптимизация прокси-класса (например: используйте invokestatic вместо invokevirtual)
Как показывает эта сравнительная таблица на официальном сайте: это быстрее
На самом деле, опять же, если бы я с самого начала использовал стороннюю базу данных, разве не было бы таких самодельных мотыльков!
Например, пул соединений Alibaba Druid не является отличным продуктом! Насколько это хорошо? Сначала вы посмотрите на его использование:
3. Другие пулы подключений (например, Druid)
3.1, Друид упоминается в SpringBoot1.0
Как и в ссылке на HikariCP в SpringBoot1.0 выше, сначала исключите источник данных по умолчанию tomcat-jdbc, а затем обратитесь к пулу соединений, который вы хотите использовать.
- 3.1.1 Сначала исключите tomcat-jdbc из источника данных конфигурации по умолчанию.
<!--配置默认数据源 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<!-- 排除默认的tomcat-jdbc数据源 -->
<exclusion>
<groupId>org.apache</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引用阿里巴巴的druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
- 3.1.2. Настройте соответствующую информацию об источнике данных Druid в файле .yml.
spring:
# 数据源的配置
datasource:
# 连接池的配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
max-active: 10
min-idle: 5
max-wait: 30000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
validation-query: SELECT 1 FROM DUAL
validation-query-timeout: 60000
test-on-borrow: false
test-on-return: false
test-while-idle: true
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 100000
- 3.1.3 Напишите класс конфигурации для загрузки источника данных
@Configuration
@ConditionalOnClass(DruidDataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource", matchIfMissing = true)
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.druid")
public DataSource dataSourceOne() {
return DruidDataSourceBuilder.create().build();
}
}
- 3.1.4 Эффект запуска:
2020-01-17 16:59:32.804 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2020-01-17 16:59:32.806 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSourceOne' has been autodetected for JMX exposure
2020-01-17 16:59:32.808 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'statFilter' has been autodetected for JMX exposure
2020-01-17 16:59:32.818 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSourceOne': registering with JMX server as MBean [com.alibaba.druid.spring.boot.autoconfigure:name=dataSourceOne,type=DruidDataSourceWrapper]
2020-01-17 16:59:32.822 INFO 8520 --- [ main ] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'statFilter': registering with JMX server as MBean [com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter]
2020-01-17 16:59:32.932 INFO 8520 --- [ main ] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 18001 (http)
2020-01-17 16:59:32.943 INFO 8520 --- [ main ] c.j.mmzsblog.DatasourceTestApplication : Started DatasourceTestApplication in 8.328 seconds (JVM running for 10.941)
3.2, Друид упоминается в SpringBoot2.0
Ссылка на Друида в SpringBoot 2.0 аналогична его представлению в SpringBoot 1.0;
- 3.2.1 Не обязательно исключать источник данных из конфигурации по умолчанию, а напрямую вводить источник данных Druid
<!-- 引用阿里巴巴的druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
- 3.2.2. Соответствующая информация источника данных Druid, настроенная в файле .yml, такая же, как в 3.1.3.
- 3.2.3 Напишите класс конфигурации для загрузки источника данных, как в 3.1.3.
- 3.2.4 Вы также можете увидеть аналогичную информацию, напечатанную после запуска
Located MBean 'dataSourceOne': registering with JMX server as MBean [com.alibaba.druid.spring.boot.autoconfigure:name=dataSourceOne,type=DruidDataSourceWrapper]
3.3 Где совершенство?
После прочтения приведенного выше использования, это супер просто и бесполезно?
Во-первых, давайте взглянем на сравнение между несколькими традиционными пулами соединений, представленными на официальном сайте druid:Как видно из приведенной выше таблицы, пул соединений Druid намного превосходит конкурирующие продукты с точки зрения производительности, мониторинга, диагностики, безопасности и масштабируемости.
Официальный сайт описывает это так:
Пул соединений Druid — это проект пула соединений с базой данных с открытым исходным кодом Alibaba. Пул соединений Druid создан для мониторинга, встроенная мощная функция мониторинга, функции мониторинга не влияют на производительность. Мощный, может предотвратить внедрение SQL, встроенное ведение журнала может диагностировать поведение приложения Hack.
Итак, Xiaobian, я так долго думал об этом, и я хочу понять одну вещь. Я все равно буду использовать пул соединений Druid от Alibaba в будущем. Он легко доступен и имеет свой собственный мониторинг. Он был протестирован Основные системы Alibaba.Продукты, заслуживающие доверия и беззаботные.
Ссылаться на:
- 1: Преимущества HikariCP: https://www.jianshu.com/p/129efe2c8e49
- 2. Официальный сайт Друида: https://github.com/alibaba/druid/
Добро пожаловать в публичный аккаунт:
Сайт личного блога:www.mmzsblog.cn