From 2edd53432bb926bf880a651ebc47373eba2bca08 Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Thu, 13 Dec 2018 15:34:07 +0800 Subject: [PATCH] improved init performance. --- .../alibaba/druid/pool/DruidDataSource.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 54c03cd0c2..09ce49361c 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -150,6 +150,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat private boolean asyncInit = false; protected boolean killWhenSocketReadTimeout = false; + private static List autoFilters = null; + private boolean loadSpifilterSkip = false; + protected static final AtomicLongFieldUpdater recycleErrorCountUpdater = AtomicLongFieldUpdater.newUpdater(DruidDataSource.class, "recycleErrorCount"); protected static final AtomicLongFieldUpdater connectErrorCountUpdater @@ -157,6 +160,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat protected static final AtomicLongFieldUpdater resetCountUpdater = AtomicLongFieldUpdater.newUpdater(DruidDataSource.class, "resetCount"); + public DruidDataSource(){ this(false); } @@ -480,6 +484,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } } } + { + String property = System.getProperty("druid.load.spifilter.skip"); + if (property != null && !"false".equals(property)) { + loadSpifilterSkip = true; + } + } } public boolean isKillWhenSocketReadTimeout() { @@ -1008,22 +1018,28 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat * @see ServiceLoader */ private void initFromSPIServiceLoader() { - - String property = System.getProperty("druid.load.spifilter.skip"); - if (property != null) { + if (loadSpifilterSkip) { return; } - ServiceLoader druidAutoFilterLoader = ServiceLoader.load(Filter.class); + if (autoFilters == null) { + List filters = new ArrayList(); + ServiceLoader autoFilterLoader = ServiceLoader.load(Filter.class); - for (Filter autoFilter : druidAutoFilterLoader) { - AutoLoad autoLoad = autoFilter.getClass().getAnnotation(AutoLoad.class); - if (autoLoad != null && autoLoad.value()) { - if (LOG.isInfoEnabled()) { - LOG.info("load filter from spi :" + autoFilter.getClass().getName()); + for (Filter filter : autoFilterLoader) { + AutoLoad autoLoad = filter.getClass().getAnnotation(AutoLoad.class); + if (autoLoad != null && autoLoad.value()) { + filters.add(filter); } - addFilter(autoFilter); } + autoFilters = filters; + } + + for (Filter filter : autoFilters) { + if (LOG.isInfoEnabled()) { + LOG.info("load filter from spi :" + filter.getClass().getName()); + } + addFilter(filter); } }