hibernate性能消耗太狠了。果断减肥引发的连串意外惊喜
2016-05-30 16:52
351 查看
近期在云服务器上新部署了一个项目
硬件配置 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引入
HikariCP 是一个高性能的 JDBC 连接池组件。下图是性能的比较测试结果:
使用方法:
?
或者:
?
spring 下引入方式:
或
或
spring boot 可以采用以下方式获取数据源
下面我们来证实一下是不是吹的。
把druid 换掉。上一张jprofiler测试的加载时间图,druid耗时排前三
我们来看看HiKaricp的效果
哇。相比上张druid是不是好很多。
牛啊。果断所有的项目连接池都换装HiKaricp
未完。。待续
硬件配置 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 连接池组件。下图是性能的比较测试结果:
使用方法:
?
?
<!-- 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&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
未完。。待续
相关文章推荐
- hdu2665 && poj2104划分树
- python基础之异常处理
- 网上订餐系统1
- php命名空间详解
- mysql如何保证redolog和binlog的一致性,安全性,效率。
- jQuery增加和删除表格项目及实现表格项目排序的方法
- Android Service完全解析,关于服务你所需知道的一切(下)
- C语言之尾队列tailq
- 如何在Android中添加系统服务
- 我眼中的技术地图
- 让Jackson JSON生成的数据包含的中文以unicode方式编码
- NSString 中包含中文字符时转换为NSURL
- easyui 中 的同步树(1)
- UIImage 拉伸方法
- [Maven]2, pom文件以及三个生命周期
- 关于Python中面向对象
- Python使用struct处理二进制--pack,unpack
- T-SQL Part V: Locks
- drawable下的非图片资源之selector
- ios开发——CMDeviceMotion陀螺仪的使用