• hibernate性能消耗太狠了。果断减肥引发的连串意外惊喜


    近期在云服务器上新部署了一个项目  

    硬件配置 CPU: 2核    内存: 4096 MB (I/O优化)

    开始是调试测试在用 没发觉,今天我看了下监控

    cpu使用率达到了60-70% 而且一直持续

    我怀疑是java 环境没配置。

    重新配置了一下。还是不行

    最后把hibernate项目先停掉。留mybatis项目来跑看看

    马上cpu消耗掉下来了。

    我的天啊。接下来来给这个后台项目减肥了。

    接下来优化hibernate配置看看cpu消耗会不会有好转

    优化一,把spring及连接池的包都更新到最新版

    然后把quartz框架 还有一些不相关的jar包 maven引用都去掉了

    这时看下cpu耗时

    少了很多。比第一次测好多了

    优化了java程序,在java7下还是很高

    所以果断换装 java8+tomcat8

    奇迹出现了

    突然想起上次跟51的大神交流有一个日本人开发的高性能数据库连接池

    于是找大神要来了名字,maven引入

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>2.4.5</version>
        <scope>compile</scope>
    </dependency>

    HikariCP 是一个高性能的 JDBC 连接池组件。下图是性能的比较测试结果:

    使用方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HikariConfig config = new HikariConfig();
    config.setMaximumPoolSize(100);
    config.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
    config.addDataSourceProperty("serverName""localhost");
    config.addDataSourceProperty("port""3306");
    config.addDataSourceProperty("databaseName""mydb");
    config.addDataSourceProperty("user""bart");
    config.addDataSourceProperty("password""51mp50n");
     
    HikariDataSource ds = new HikariDataSource(config);

    或者:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /**
    connectionTestQuery=SELECT 1
    dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
    dataSource.user=test
    dataSource.password=test
    dataSource.databaseName=mydb
    dataSource.serverName=localhost
    */
     
    HikariConfig config = new HikariConfig("some/path/hikari.properties");
    HikariDataSource ds = new HikariDataSource(config);
    spring 下引入方式:
        <!-- HikariCP 高性能数据库连接池 -->
        <bean id="dataSourceTarget"
              class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown">
            <constructor-arg>
                <bean class="com.zaxxer.hikari.HikariConfig">
                    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
                    <property name="jdbcUrl" value="jdbc:mysql://xxxxxxxx:3306/xxxxxxxx?useUnicode=true&amp;characterEncoding=utf-8"/>
                    <property name="username" value="xxxxxxxxx"/>
                    <property name="password" value="xxxxxxxxx"/>
                    <!--<property name="connectionTestQuery" value="${hikaricp.connectionTestQuery}"/>-->
                    <property name="connectionTimeout" value="30000"/>
                    <property name="idleTimeout" value="600000"/>
                    <property name="maxLifetime" value="1800000"/>
                    <property name="maximumPoolSize" value="20"/>
                    <property name="minimumIdle" value="1"/>
                </bean>
            </constructor-arg>
        </bean>

     或

    <bean id = "dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">  
            <property name="driverClassName" value="${jdbc.driverClassName}" />  
            <property name="jdbcUrl" value="${jdbc.url}" />  
            <property name="username" value="${jdbc.username}" />  
            <property name="password" value="${jdbc.password}" />  
            <property name="maximumPoolSize" value="100" />  
            <property name="minimumIdle" value="10" />  
            <property name="connectionTestQuery" value="select 1" />  
            <property name="dataSourceProperties">  
                <props>  
                    <prop key="cachePrepStmts">true</prop>  
                    <prop key="prepStmtCacheSize">250</prop>  
                    <prop key="prepStmtCacheSqlLimit">2048</prop>  
                    <prop key="useServerPrepStmts">true</prop>  
                </props>  
            </property>  
        </bean>  

    <!-- Hikari Datasource -->
        <bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource"
            destroy-method="shutdown">
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="jdbcUrl" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <!-- 连接只读数据库时配置为true, 保证安全 -->
            <property name="readOnly" value="false" />
            <!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 -->
            <property name="connectionTimeout" value="30000" />
            <!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
            <property name="idleTimeout" value="600000" />
            <!-- 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL 
                wait_timeout参数(show variables like '%timeout%';) -->
            <property name="maxLifetime" value="1800000" />
            <!-- 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) -->
            <property name="maximumPoolSize" value="60" />
            <property name="minimumIdle" value="10" />
        </bean>

    spring boot 可以采用以下方式获取数据源

    private DataSource dataSource() {
            ...
    
            final HikariDataSource ds = new HikariDataSource();
            ds.setMaximumPoolSize(100);
            ds.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
            ds.addDataSourceProperty("url", url);
            ds.addDataSourceProperty("user", username);
            ds.addDataSourceProperty("password", password);
            ds.addDataSourceProperty("cachePrepStmts", true);
            ds.addDataSourceProperty("prepStmtCacheSize", 250);
            ds.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
            ds.addDataSourceProperty("useServerPrepStmts", true);
            return ds;
        }

    下面我们来证实一下是不是吹的。

    把druid 换掉。上一张jprofiler测试的加载时间图,druid耗时排前三

    我们来看看HiKaricp的效果

    哇。相比上张druid是不是好很多。

    牛啊。果断所有的项目连接池都换装HiKaricp

    未完。。待续

  • 相关阅读:
    SQL语句调优
    Oracle start with connect by prior
    博客园如何转载博客
    初遇java.lang.NoClassDefFoundError
    二叉搜索树、B树、B+树、B*树
    初见POJO
    win10系统Myeclipse装载tomcat7.0x遇见的新问题
    Myeclise新导入项目遇到的红色感叹号和红色叉问题
    SSM框架中文乱码解决方案
    第五天
  • 原文地址:https://www.cnblogs.com/fangyuan303687320/p/5543064.html
Copyright © 2020-2023  润新知