背景:
Java 功能压测的时候,执行数据库sql缓慢分析报错,使用的Sharding-jdbc,进行了分库分表。高TPS访问时,遇到了瓶颈,
报错:
"http-bio-8088-exec-3762" - Thread t@188077
   java.lang.Thread.State: BLOCKED
    at sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:543)
    - waiting to lock <404ee8b2> (a java.lang.Object) owned by "http-bio-8088-exec-3552" t@187443
    at sun.security.provider.NativePRNG$RandomIO.access$400(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineNextBytes(NativePRNG.java:220)
    at java.security.SecureRandom.nextBytes(SecureRandom.java:468)
    at java.util.UUID.randomUUID(UUID.java:145)
    at io.shardingsphere.core.event.ShardingEvent.<init>(ShardingEvent.java:32)
    at io.shardingsphere.core.event.executor.SQLExecutionEvent.<init>(SQLExecutionEvent.java:34)
    at io.shardingsphere.core.event.executor.DMLExecutionEvent.<init>(DMLExecutionEvent.java:34)
    at io.shardingsphere.core.event.executor.SQLExecutionEventFactory.createEvent(SQLExecutionEventFactory.java:51)
    at io.shardingsphere.core.executor.sql.execute.SQLExecuteCallback.execute0(SQLExecuteCallback.java:89)
    at io.shardingsphere.core.executor.sql.execute.SQLExecuteCallback.execute(SQLExecuteCallback.java:69)
    at io.shardingsphere.core.executor.ShardingExecuteEngine.syncGroupExecute(ShardingExecuteEngine.java:182)
    at io.shardingsphere.core.executor.ShardingExecuteEngine.groupExecute(ShardingExecuteEngine.java:158)
    at io.shardingsphere.core.executor.sql.execute.SQLExecuteTemplate.executeGroup(SQLExecuteTemplate.java:71)
    at io.shardingsphere.core.executor.sql.execute.SQLExecuteTemplate.executeGroup(SQLExecuteTemplate.java:54)
    at io.shardingsphere.shardingjdbc.executor.AbstractStatementExecutor.executeCallback(AbstractStatementExecutor.java:122)
    at io.shardingsphere.shardingjdbc.executor.PreparedStatementExecutor.execute(PreparedStatementExecutor.java:161)
    at io.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.execute(ShardingPreparedStatement.java:139)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
    at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
    at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
    at sun.reflect.GeneratedMethodAccessor501.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
    at com.sun.proxy.$Proxy49.update(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:294)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
    at com.sun.proxy.$Proxy79.updateByAgentNoAndTradeOrderNo(Unknown Source)
主要原因是底层 使用了java.util.UUID.randomUUID,其中sun.security.provider.NativePRNG$RandomIO.implNextBytes 获取随机数,上锁了,block.

 

目前解决方案:
在tomcat 配置中  -Djava.security.egd=file:/dev/./urandom

参考:https://www.cnblogs.com/softidea/p/9725156.html

posted on 2019-07-29 10:41  kevenYuan  阅读(1204)  评论(0编辑  收藏  举报