Spring-Boot: ¿Cómo configuro las propiedades del grupo JDBC como el número máximo de conexiones?

81

Spring-Boot es una herramienta bastante impresionante, pero la documentación es un poco escasa cuando se trata de una configuración más avanzada. ¿Cómo puedo establecer propiedades como el tamaño máximo para mi grupo de conexiones de base de datos?

Spring-Boot es compatible y tomcat-jdbc, de forma nativa, ¿están todos configurados de la misma manera?HikariCPCommons DBCP

JBCP
fuente
Me parece mejor usar un proveedor de fuente de datos diferente como BoneCP o C3P0
Luiggi Mendoza
3
-Dspring.datasource.tomcat.initial-size=10(el valor predeterminado es 10)
Christophe Roussy

Respuestas:

122

Resulta que establecer estas propiedades de configuración es bastante sencillo, pero la documentación oficial es más general, por lo que puede ser difícil de encontrar cuando se busca específicamente información de configuración del grupo de conexiones.

Para establecer el tamaño máximo de grupo para tomcat-jdbc, establezca esta propiedad en su archivo .properties o .yml:

spring.datasource.maxActive=5

También puede utilizar lo siguiente si lo prefiere:

spring.datasource.max-active=5

Puede establecer cualquier propiedad de grupo de conexiones que desee de esta manera. Aquí hay una lista completa de propiedades admitidas portomcat-jdbc .

Para comprender cómo funciona esto de manera más general, debe profundizar un poco en el código Spring-Boot.

Spring-Boot construye el DataSource de esta manera ( ver aquí , línea 102):

@ConfigurationProperties(prefix = DataSourceAutoConfiguration.CONFIGURATION_PREFIX)
@Bean
public DataSource dataSource() {
    DataSourceBuilder factory = DataSourceBuilder
            .create(this.properties.getClassLoader())
            .driverClassName(this.properties.getDriverClassName())
            .url(this.properties.getUrl())
            .username(this.properties.getUsername())
            .password(this.properties.getPassword());
    return factory.build();
}

El DataSourceBuilder es responsable de averiguar qué biblioteca de agrupación usar, verificando cada una de una serie de clases conocidas en la ruta de clases. Luego construye el DataSource y lo devuelve a la dataSource()función.

En este punto, la magia comienza a usarse @ConfigurationProperties. Esta anotación le dice a Spring que busque propiedades con prefijo CONFIGURATION_PREFIX(que es spring.datasource). Para cada propiedad que comience con ese prefijo, Spring intentará llamar al establecedor en el DataSource con esa propiedad.

Tomcat DataSource es una extensión de DataSourceProxy , que tiene el método setMaxActive().

¡Y así es como spring.datasource.maxActive=5se aplica correctamente!

¿Qué pasa con otros grupos de conexiones?

No lo he intentado, pero si está utilizando uno de los otros grupos de conexiones compatibles con Spring-Boot (actualmente HikariCP o Commons DBCP), debería poder configurar las propiedades de la misma manera, pero deberá mirar el proyecto documentación para saber qué hay disponible.

JBCP
fuente
6
No es documentación explícita de que uno (como es el caso): docs.spring.io/spring-boot/docs/current/reference/htmlsingle/... . También puede iniciar la aplicación y mirar / configprops (con Actuator). El problema de la documentación es que todas las implementaciones de DataSource tienen propiedades ligeramente diferentes (solo se vincula a un bean Java).
Dave Syer
Gracias por señalar esto @DaveSyer, no es muy amigable con el SEO cuando se buscan palabras clave relacionadas con el grupo de conexiones. Estoy de acuerdo con la diferencia de que los grupos de conexiones tienen configuraciones diferentes, por eso agregué una sección sobre eso. Actualizaré la respuesta.
JBCP
8
Vea otras respuestas como las de Daniel y wildloop. A partir de versiones posteriores de Spring Boot, muchas configuraciones requieren que establezca la configuración específica del proveedor. p . ej . spring.datasource.tomcat.max-activeo spring.datasource.hikari.maximum-pool-size.
Dan Tanner
Para mi caso solo spring.datasource.maxActive=1funcionó. Esta línea spring.datasource.max-active=1no funcionó para mí. Versión Spring Boot2.2.2.RELEASE
Rafael
32

En la versión actual de Spring-Boot (1.4.1.RELEASE), cada implementación de fuente de datos agrupada tiene su propio prefijo para las propiedades.

Por ejemplo, si está utilizando tomcat-jdbc:

spring.datasource.tomcat.max-wait=10000

Puedes encontrar la explicación aquí

spring.datasource.max-wait=10000

esto ya no tiene ningún efecto.

Daniel Nuss
fuente
6

Los diferentes grupos de conexiones tienen diferentes configuraciones.

Por ejemplo, Tomcat (predeterminado) espera:

spring.datasource.ourdb.url=...

y HikariCP estará contento con:

spring.datasource.ourdb.jdbc-url=...

Podemos satisfacer ambos sin una configuración estándar:

spring.datasource.ourdb.jdbc-url=${spring.datasource.ourdb.url}

No hay ninguna propiedad para definir el proveedor del grupo de conexiones.

Eche un vistazo a la fuente DataSourceBuilder.java

Si Tomcat, HikariCP o Commons DBCP están en la ruta de clase, se seleccionará uno de ellos (en ese orden con Tomcat primero).

... entonces, podemos reemplazar fácilmente el proveedor del grupo de conexiones usando esta configuración de maven (pom.xml):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </exclusion>
        </exclusions>
    </dependency>       

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
kinjelom
fuente
3

Según su tipo de aplicación / tamaño / carga / no. de usuarios ..etc - u puede seguir siguiendo sus propiedades de producción

spring.datasource.tomcat.initial-size=50
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=300
spring.datasource.tomcat.max-idle=150
spring.datasource.tomcat.min-idle=8
spring.datasource.tomcat.default-auto-commit=true
Pravin
fuente
Agregar spring.datasource.tomcat.max-active=5 spring.datasource.tomcat.max-idle=5fue suficiente para mí, ¡gracias!
L.Butz