• java jdk 随机数阻塞问题


    背景:
    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

  • 相关阅读:
    百度开发者中心BAE新建Java应用
    微信公众平台开发(三)位置信息的识别
    确定路名、标志性建筑和商场名的经度纬度
    Eclipse中Java Project转换为Java Web Project
    你应该知道的8个Java牛人
    周边信息查询
    在Java中避免空指针异常(Null Pointer Exception)
    google guava使用例子/示范(一)
    docker 相关链接
    HashMap 的数据结构
  • 原文地址:https://www.cnblogs.com/shunxiyuan/p/11262579.html
Copyright © 2020-2023  润新知