剛開始使用的是這種方式連接請求:
for(int i = 0;i<= 100000000;i++){
val request = Web3j.build(new HttpService(address)).ethGetBlockByNumber(defaultBlockParameter, true)
}
跟蹤源碼發現HttpService中使用的是Okhttp的連接池,Build的初始化代碼如下:
也就是說,在每次創建一個新的httpService時,都創建一個數據庫連接池,導致服務端的連接被撐爆了。
經過優化后使用如下方式,將復用ConnectionPool:
val connectionPool:ConnectionPool = new ConnectionPool(1500,5L, TimeUnit.MINUTES)
for(int i = 0;i<= 100000000;i++){
val httpService = new HttpService(address,getHttpClient(connectionPool),false) val request = Web3j.build(httpService).ethGetBlockByNumber(defaultBlockParameter, true)
//業務代碼
}
//復用連接池
private def getHttpClient(pool:ConnectionPool):OkHttpClient = {
new OkHttpClient().newBuilder().connectionPool(pool).build()
}
參考:https://www.cnblogs.com/greyzeng/p/14148675.html