立即注册
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广州大学城网业务调整

[Java/JSP] 你有所不知的提高spring+hibernate性能的一个方法 [复制链接] qrcode

查看: 2368 | 回复: 0

大法师的 该用户已被删除
发表于: 2013-1-2 16:15:46 | 显示全部楼层

spring + hibernate
的应用中,你监控
mysql
日志,你会发现大量的
log
如下:


Java代码

1.      158268 Query       SET autocommit=1     
2.      158268 Query       SET autocommit=1     
3.      158268 Query       SET autocommit=1     
4.      158268 Query       SET autocommit=0     
5.      158268 Query       commit      
6.      158268 Query       SET autocommit=1     
7.      158268 Query       SET autocommit=1     
8.      158268 Query       SET autocommit=1     
9.      158268 Query       SET autocommit=0     
10.   158268 Query       commit  
   
另外,你如果看
mysqlreport
,你会发现
set_option
commt
几乎占了
mysql query
的一半!!


原因是?


我们先看第一个问题:


Java代码

1.      158268 Query       SET autocommit=0  
2.      158268 Query       commit  
            

这种日志产生的原因是
hibernate
查询时,如果所请求的对象在
cache
中,那么
hibernate
仍然会向数据库发出这样的两个
sql
语句。


再来看第二个问题


Java代码

1.      158268 Query       SET autocommit=1  
这是因为当
connection
被放回
conn pool
时,
conn pool
会恢复此连接取出时的
autocommit
状态。一般连接池里面的
autocommit
状态为
true
,所以每个查询都会紧跟着一个
set autocommit
1


对第一个问题我们的解决方案:


那就是利用
LazyConnectionDataSourceProxy


这个
conn
代理的作用就是,只有当确实有必要时,他它向
DB
发出查询。一切没有必要的
set autocommit=0 commit
语句都不会发向数据库。


class
的详细作用请参见
spring
文档


example
配置如下
:


Java代码

1.         
2.      <bean id="dataSourceTarget" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">   
3.        <property name="driverClass"><value>com.mysql.jdbc.Driver</value></property>   
4.        <property name="jdbcUrl"><value>jdbc:mysql   
5.      ://localhost:3306/imagedb</value></property>   
6.        <property name="user"><value>admin</value></property>   
7.        <property name="password"><value></value></property>   
8.        
9.       <property name="initialPoolSize" value="60" />   
10.           <property name="minPoolSize" value="50" />   
11.           <property name="maxPoolSize" value="80" />   
12.           <property name="maxIdleTime" value="7200" />   
13.     
14.           <property name="idleConnectionTestPeriod" value="360" />   
15.           <property name="preferredTestQuery" value="select 1" />   
16.           <property name="acquireIncrement" value="5" />   
17.           <property name="acquireRetryAttempts" value="50" />   
18.           <property name="acquireRetryDelay" value="1000" />   
19.           <property name="breakAfterAcquireFailure" value="true" />   
20.     
21.           <!--property name="checkoutTimeout" value="1000" /-->   
22.     
23.           <property name="autoCommitOnClose" value="false" />   
24.           <property name="forceIgnoreUnresolvedTransactions" value="false" />   
25.           <property name="unreturnedConnectionTimeout" value="1000" />   
26.     
27.           <property name="maxStatements" value="0" />   
28.           <property name="maxStatementsPerConnection" value="0" />   
29.     
30.           <property name="testConnectionOnCheckin" value="true" />   
31.           <property name="testConnectionOnCheckout" value="false" />   
32.           <property name="usesTraditionalReflectiveProxies" value="false" />   
33.     
34.           <property name="numHelperThreads" value="5" />   
35.   </bean>   
36.     
37.   <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">   
38.     <property name="targetDataSource"><ref local="dataSource"/></property>   
39.   </bean>  

1.        
第二个问题的解决方案:


通过
conn pool
jdbc url
autocommit
设为
false
来解决,不过
mysql driver
好像不支持这个设置。


另外,如果你使用的是
mysql
,那么第一个问题还有一个更简单的解决方案,那就是在
jdbcUrl
中加入


useLocalSessionState=true


这可以达到和


Java代码

1.      LazyConnectionDataSourceProxy   

一样的效果

QQ 744437114
  疯狂软件官网:http://www.fkjava.org
  疯狂java视频 android视频:http://www.fkjava.org/video.html



跳转到指定楼层
快速回复 返回顶部 返回列表