刚开始使用的是这种方式连接请求:
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