Spring Boot: Come si impostano le proprietà del pool JDBC come il numero massimo di connessioni?

Spring-Boot è uno strumento davvero fantastico, ma la documentazione è un po ‘scarsa per quanto riguarda la configurazione più avanzata. Come posso impostare proprietà come la dimensione massima per il mio pool di connessione al database?

Spring-Boot supporta tomcat-jdbc , HikariCP e Commons DBCP nativamente sono tutti configurati allo stesso modo?

Si scopre che l’impostazione di queste proprietà di configurazione è piuttosto semplice, ma la documentazione ufficiale è più generale, quindi potrebbe essere difficile da trovare durante la ricerca specifica delle informazioni di configurazione del pool di connessioni.

Per impostare la dimensione massima del pool per tomcat-jdbc, impostare questa proprietà nel file .properties o .yml:

 spring.datasource.maxActive=5 

Puoi anche usare il seguente se preferisci:

 spring.datasource.max-active=5 

È ansible impostare qualsiasi proprietà del pool di connessioni che si desidera in questo modo. Ecco un elenco completo delle proprietà supportate da tomcat-jdbc .

Per capire come funziona in generale è necessario scavare un po ‘nel codice Spring-Boot.

Spring-Boot costruisce il DataSource come questo ( vedi qui , riga 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(); } 

DataSourceBuilder è responsabile di determinare quale libreria di pool utilizzare, controllando ciascuna di una serie di classi conosciute sul classpath. Quindi costruisce il DataSource e lo restituisce alla funzione dataSource() .

A questo punto, la magia inizia a usare @ConfigurationProperties . Questa annotazione indica a Spring di cercare le proprietà con il prefisso CONFIGURATION_PREFIX (che è spring.datasource ). Per ogni proprietà che inizia con quel prefisso, Spring proverà a chiamare il setter sul DataSource con quella proprietà.

Tomcat DataSource è un’estensione di DataSourceProxy , che ha il metodo setMaxActive() .

Ed è così che spring.datasource.maxActive=5 viene applicato correttamente!

Che dire degli altri pool di connessioni

Non ho provato, ma se stai usando uno degli altri pool di connessione supportati da Spring-Boot (attualmente HikariCP o Commons DBCP) dovresti essere in grado di impostare le proprietà allo stesso modo, ma dovrai guardare il progetto documentazione per sapere cosa è disponibile.

Alla versione corrente di Spring-Boot (1.4.1.RELEASE), ciascuna implementazione di datasource di pool ha il proprio prefisso per le proprietà.

Ad esempio, se si utilizza tomcat-jdbc:

 spring.datasource.tomcat.max-wait=10000 

Puoi trovare la spiegazione qui

 spring.datasource.max-wait=10000 

questo non ha più alcun effetto.

Pool di connessioni differenti hanno configurazioni differenti.

Ad esempio Tomcat (predefinito) si aspetta:

 spring.datasource.ourdb.url=... 

e HikariCP sarà felice con:

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

Possiamo soddisfare entrambi senza configurazione di boilerplate:

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

Non esiste una proprietà per definire il provider del pool di connessioni.

Dai un’occhiata all’origine DataSourceBuilder.java

Se Tomcat, HikariCP o Commons DBCP si trovano sul classpath, verrà selezionato uno di essi (in questo ordine con Tomcat per primo).

… così, possiamo facilmente sostituire il provider del pool di connessione usando questa configurazione maven (pom.xml):

   org.springframework.boot spring-boot-starter-jdbc   org.apache.tomcat tomcat-jdbc     com.zaxxer HikariCP