1.使用HikariDataSource,在apollo配置更新出现异常
如图:
在我们使用druid创建多数据源,连接Orcale创建Bean,HkariDataSoure,明明启动创建bean没有报错,为什么在apollo配置更新的时候出现的这个错误。这让我百思不得其解
然后我搜搜的去网上百度找问题,发现网上跟我相关的问题太少了。
这时百度失灵,迫于无奈,踏上了看源码之入看看到底是那些问题?
废话不多说,先上几个关键的源码图
这里就是我们apollo配置中的值,加载bean设置值的类型的地方这样到后面可以通过反射调用,ConfigurationPropertyName就是我们apollo上配置加载的key。
在我一路跟踪之下发现了更HikariDataSource数据源创建的jdbc-url,设置有问题,我就在想看表面还是看不出什么,但我锁定了那个配置的数据配置key出了问题?
再往下看,我们继续跟踪一下
一张图截不完,请原谅我电脑垃圾,现在跟踪到这里,这里就是绑定bean的办法,找到他的字类javaBeanBinder。下面标红就是他设置值的方法
咋一看invoke是不是很熟悉,这不就是反射调用会出现的吗?我开始以为jdbc-url,不会不会映射jdbcUrl吧,实时我想错了,映射HikariConfig中的jdbcUrl是没问题的(注明一下:在DataSource进行build构建是有解析选择的两种类型,一种url,一种jdbc-url,这里不贴图了,大家可以去看源码)
在这一步我确认了调用的方法是jdbcUrl,我就觉得为啥设置jdbcUrl会报错?然后锁定到了HikariConfig的设置配置
万万没想到暗藏玄机啊,还有一层校验
不出意外是这个问题了,我一看sealed是true,没想到居然是这个错误。。。
我们看一下异常描述
The configuration of the pool is sealed once started. Use HikariConfigMXBean for runtime changes.
原来是数据源池加载时封装了,检查封闭了就不允许更新,如果要更新使用HikariconfigMxBean
咋一看,咦咋没有更新的接口呢?于是我锁定了他的字类也就是配置类找到HikariConfig中的copyStateTo方法
整个类看了一圈,只有这里设置为false,在一看方法,emmm......很像,然后我一试
在apollo监听配置更新前设置这个,果然让他的检索池封闭开关为false,然后就配没报错了
运行一下
成功
问题已解决,果然,通过自己努力找出问题感觉就是不一样
谢谢大家观看,新人初来乍到,第一次发文章,有说的不对的地方欢迎大佬更正指点。