Comment définir les propriétés de la connexion à la source de données au Printemps de Démarrage 1.3.x avec par défaut de Tomcat pool de connexion
J'ai besoin de régler certaines Oracle JDBC dans les propriétés de connexion afin d'accélérer lot INSERT
s (defaultBatchValue
) et la masse SELECT
s (defaultRowPrefetch
).
J'ai eu suggestions comment réaliser cela avec DBCP (Merci à M. Deinum) mais je voudrais:
- conserver la valeur par défaut de Tomcat pool de connexions jdbc
- garder de l'application.yml pour la configuration
Je pensais à une demande de fonctionnalité pour soutenir spring.datasource.custom_connection_properties
ou similaires dans l'avenir et de ce fait essayé de le prétend ce qui était déjà possible. Je l'ai fait en transmettant les informations pertinentes lors de la création de la source de données et manipulé la création de la source de données comme ceci:
@Bean
public DataSource dataSource() {
DataSource ds = null;
try {
Field props = DataSourceBuilder.class.getDeclaredField("properties");
props.setAccessible(true);
DataSourceBuilder builder = DataSourceBuilder.create();
Map<String, String> properties = (Map<String, String>) props.get(builder);
properties.put("defaultRowPrefetch", "1000");
properties.put("defaultBatchValue", "1000");
ds = builder.url( "jdbc:oracle:thin:@xyz:1521:abc" ).username( "ihave" ).password( "wonttell" ).build();
properties = (Map<String, String>) props.get(builder);
log.debug("properties after: {}", properties);
} ... leaving out the catches ...
}
log.debug("We are using this datasource: {}", ds);
return ds;
}
Dans les logs je vois que je suis la création de la bonne source de données:
2016-01-18 14:40:32.924 DEBUG 31204 --- [ main] d.a.e.a.c.config.DatabaseConfiguration : We are using this datasource: org.apache.tomcat.jdbc.pool.DataSource@19f040ba{ConnectionPool[defaultAutoCommit=null; ...
2016-01-18 14:40:32.919 DEBUG 31204 --- [ main] d.a.e.a.c.config.DatabaseConfiguration : properties after: {password=wonttell, driverClassName=oracle.jdbc.OracleDriver, defaultRowPrefetch=1000, defaultBatchValue=1000, url=jdbc:oracle:thin:@xyz:1521:abc, username=ihave}
L'actionneur me montre que mon code a remplacé la source de données:
Mais les paramètres ne sont pas activé, je peux voir tout le profil de l'application. Le defaultRowPrefetch
est encore à 10
qui provoque mon SELECT
s être beaucoup plus lent que ce qu'ils seraient si 1000
a été activé.
- La modification des propriétés n'est pas d'aller travailler, ce ne sont pas les propriétés que vous souhaitez modifier...
- Je pensais que c'étaient les propriétés transmises lors de la connexion du pilote JDBC. Ce qui les rend différent de ce à quoi j'ai pensé ?
- Non, ils ne sont pas transmis lors de la connexion. Ce sont les propriétés internes utilisés par le
DataSourceBuilder
et ne contiennent qu'un petit nombre de utilisable propriétés pour une utilisation interne. - Vous avez raison, j'ai quitté cette grâce dans le débogueur et vu que même si DataSourceBuilder honorer ces propriétés tomcat source des données jdbc / ~Proxy ne fournit pas directement setter pour cela.
Vous devez vous connecter pour publier un commentaire.
Réglage de l'piscines connectionProperties devrait fonctionner. Ceux-ci seront transmis au pilote JDBC. Ajouter cette application.propriétés:
Modifier (un peu de fond de l'information):
source: spring-boot de la documentation
defaultRowPrefetch
doit être passé dans un ensemble deProperties
qui est le deuxième paramètre utilisé dansgetConnection(String url, Properties prop)
et suit juste après l'url jdbc. Mais néanmoins merci pour votre montage.Quelques informations supplémentaires pour compléter la réponse de @Cyril. Si vous voulez upvote utilisation de sa réponse, pas la mienne.
J'ai été un petit peu surpris combien il est facile de définir d'autres propriétés de la connexion qu'à la fin, obtenir utilisé lors de la création de la connexion de base de données. J'ai donc fait un peu de recherche.
spring.datasource.connectionProperties
est pas mentionné dans la référence. J'ai créé un question à cause de cela.Si j'avais utilisé le Printemps de Démarrage YML de l'éditeur, je l'aurais vu les propriétés qui sont pris en charge. Voici ce que STS suggère quand vous créez un
application.yml
et appuyez sur Ctrl+Espace:Le tableau de bord n'a pas d'importance parce que de détendu liaison mais si vous l'interpréter littéralement les propertys nom est
spring.datasource.connection-properties
.La bonne installation de l'application.yml ressemble à ceci:
Cela devient honoré qui est prouvé par mon perf4j mesures de masse
SELECT
s.Avant:
Après:
Le temps pris pour compléter l'instruction SQL gouttes de 1377ms à 147, ce qui est un énorme gain de performances.
org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder
s méthodefindType()
qui commence à Tomcat JDBC de la Piscine et s'arrête dès qu'il trouve une correspondance par défaut est suffisant. Codewise 😉Après creuser autour dans le Tomcat code pour un peu, j'ai trouvé que le
dataSource.getPoolProperties().getDbProperties()
est leProperties
objet qui sera réellement utilisé pour générer des connexions pour la piscine.Si vous utilisez le
BeanPostProcessor
approche mentionné par @m-deinum, mais au lieu de l'utiliser pour remplir ledbProperties
comme cela, vous devriez être en mesure d'ajouter les propriétés d'une manière qui les rend bâton et se passait à l'Oracle pilote.Comme le Printemps de Démarrage est en fin de vie pour un long temps je suis passé au Printemps de Démarrage 2.1 avec sa nouvelle connexion par défaut piscine Hikari. Ici la solution est encore plus simple et peut être fait dans l'application.propriétés ou (comme ici) de l'application.yml:
(Dans une vraie vie de config il y aurait plusieurs autres éléments de configuration, mais comme ils ne sont pas d'intérêt pour la question posée, j'ai simplement laissé dans mon exemple)