Processus de découverte et d'analyse
Nous utilisons le framework Springboot et la configuration de la source de données est configurée en fonction des propriétés Springboot. Utilisez ensuite la configuration pour créer des beans druid daasource automatiques. Cela ne semble pas poser de problème.
S'il ne s'agit pas de Springboot, vous initialiserez généralement vous-même toutes les propriétés. Chargez la configuration à partir du fichier de configuration et définissez le bean DruidDataSource manuellement. Je n’ai pas beaucoup réfléchi et je l’ai simplement utilisé de cette façon. Mais au démarrage, une erreur était signalée lors de l’initialisation du bean.@Bean(name = "dataSource") @ConfigurationProperties(prefix = "ecommon.order.druid") public DataSource getOrderDataSource() { return new DruidDataSource(); }
Cela semble être correct, puis sous le débogage, le même problème se produit. L'ordre des attributs minEvictableIdleTimeMillis et maxEvictableIdleTimeMillis semble correct. Après l'avoir essayé, j'ai inversé l'ordre des deux attributs, mais le problème persistait. État aveugle~_~.
Je pense que ce problème est un peu étrange. Le temps presse, donc je trouve directement l'endroit où l'erreur est signalée et je trace le code source.
Accédez à la page d'accueil de github search alibaba druid, clonez-la directement et localisez l'emplacement de l'invite d'erreur. Il existe deux endroits où cette exception est levée lors de la recherche globale.##一个连接在池中最小生存的时间(ms) ecommon.order.druid.minEvictableIdleTimeMillis=300000 ##一个连接在池中最大生存的时间(ms) ecommon.order.druid.maxEvictableIdleTimeMillis=600000
Pour faciliter la lecture, j'ai supprimé le code dans init qui nous est inutile pour analyser le problème.
Deux : méthode setMaxEvictableIdleTimeMillis
La logique de ces deux méthodes est relativement simple. Les valeurs de ces deux attributs du bean seront vérifiées lors de l'initialisation de l'initialisation. setMaxEvictableIdleTimeMillis, il y a une vérification lors de la définition de la durée de survie maximale. Si votre temps de survie maximum est inférieur au temps de survie minimum, une erreur sera directement signalée.
public void init() throws SQLException { if (maxEvictableIdleTimeMillis < minEvictableIdleTimeMillis) { throw new SQLException("maxEvictableIdleTimeMillis must be grater than minEvictableIdleTimeMillis"); }
Grâce au débogage, j'ai découvert que l'utilisation directe de la source de données avec new DruidDataSource() n'irait pas vers la méthode init. Vous n'entrerez pas dans l'endroit où l'erreur est déclenchée. Il semble que mon chemin de code ne devrait pas générer cette vérification. Continuez à exécuter et voyez ce qui se passe avec la méthode setMaxEvictableIdleTimeMillis.
Problème détecté lors de l'exécution de la méthode setMaxEvictableIdleTimeMillis, la valeur de l'attribut minEvictableIdleTimeMillis est 1800000.
public void setMaxEvictableIdleTimeMillis(long maxEvictableIdleTimeMillis) { if (maxEvictableIdleTimeMillis < 1000 * 30) { LOG.error("maxEvictableIdleTimeMillis should be greater than 30000"); } if (maxEvictableIdleTimeMillis < minEvictableIdleTimeMillis) { throw new IllegalArgumentException("maxEvictableIdleTimeMillis must be grater than minEvictableIdleTimeMillis"); } this.maxEvictableIdleTimeMillis = maxEvictableIdleTimeMillis; }
protected volatile long minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 30L;
Deux : définissez ensuite ces deux propriétés vous-même d'abord, et il n'y aura aucune erreur lors de la configuration automatique du Springboot
L’analyse du problème s’arrête ici. Ce petit bug a été corrigé par Alibaba Druid.
Si vous souhaitez savoir comment résoudre ce problème, veuillez consulter le code de Druid sur la correction de la configuration automatique :
Tout à coup, vous comprenez que vous avez déjà bénéficié des avantages de l'open source. Vous pouvez participer à son utilisation ensemble, à la découverte de problèmes ensemble et à la correction de bugs ensemble. C’est peut-être la valeur technique fondamentale derrière d’excellentes œuvres d’art telles que Linux et git.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!