標籤(空格分隔):druid springboot start autoconfig
背景
發現、分析過程
總結
最近在使用alibaba druid進行多資料來源連線的時候無意間發現一個小bug,已經提交github issue 官方已經fix。 issue 位址:
我們使用的java開發框架是封裝好的。框架對資料來源的支援是master、slave架構的,就是可以一組多從資料來源,內部會自動進行主從寫入、查詢切換。
我們現在處於.net專java過程中,特殊場景下新java系統需要連接兩個資料來源,預設連接mysql資料來源,但是有時候還需要查詢sqlserver資料來源來取得一些相容性數據。
所以,在設定第二個資料來源的時候,系統load就會報錯。
我們使用springboot框架,datasource config 是基於springboot properties進行設定。然後使用configuration 進行自動druid daasource bean的建立。這看起來好像沒什麼問題。
@Bean(name = "dataSource") @ConfigurationProperties(prefix = "ecommon.order.druid") public DataSource getOrderDataSource() { return new DruidDataSource(); }
如果不是springboot,一般都會自己來初始化所有的屬性。從設定檔載入配置,然後手動設定DruidDataSource bean。
沒多想,就直接用這種方式使用了。但是在啟動的時候,初始化bean的時候就報錯了。
aillis;必須大於'minEvictableIdleTimeMillis'最小存活時間。 第一反應肯定是配置錯了,檢查配置。'maxEvictableIdleTimeMillis' threw exception; nested exception is java.lang.IllegalArgumentException: maxEvictableIdleTimeMillis must be grater than minEvictabletableIdleTimeMillis
aillis must be grater than minEvictabletableIdleTimeMillis
##一个连接在池中最小生存的时间(ms) ecommon.order.druid.minEvictableIdleTimeMillis=300000 ##一个连接在池中最大生存的时间(ms) ecommon.order.druid.maxEvictableIdleTimeMillis=600000
上 github search alibaba druid 首頁,直接gith clone下來,定位到錯誤提示的位置。
一: init 方法
public void init() throws SQLException { if (maxEvictableIdleTimeMillis < minEvictableIdleTimeMillis) { throw new SQLException("maxEvictableIdleTimeMillis must be grater than minEvictableIdleTimeMillis"); }
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;
@Data @EqualsAndHashCode @ConfigurationProperties(prefix = "ecommon.order.druid") public class SqlServerDruidConfig { private Long minEvictableIdleTimeMillis; private Long maxEvictableIdleTimeMillis; }
@Autowired private SqlServerDruidConfig druidConfig; @Bean(name = "dataSource") @ConfigurationProperties(prefix = "ecommon.order.druid") public DataSource getOrderDataSource() { DruidDataSource dataSource = new DruidDataSource(); /**setMinEvictableIdleTimeMillis需要先设置*/ dataSource.setMinEvictableIdleTimeMillis(druidConfig.getMinEvictableIdleTimeMillis()); dataSource.setMaxEvictableIdleTimeMillis(druidConfig.getMaxEvictableIdleTimeMillis()); return dataSource; } @Bean public SqlServerDruidConfig getDruidConfig() { return new SqlServerDruidConfig(); }
#問題到這裡分析就結束了。這個小bug,alibaba druid 已經fix。
如果你對如何fix有興趣,請參考druid 有關於autoconfiger修復的程式碼:
突然能明白,其實有關於開源的好處,你已經獲益了。可以一起參與使用,一起參與發現問題,一起參與fixbug。這也許就是linux、git這類優秀藝術品背後的核心技術價值。
以上是用alibaba druid進行多資料來源連接時的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!