<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java豆技术站点 &#187; autocommit</title>
	<atom:link href="http://javadou.com/tag/autocommit/feed/" rel="self" type="application/rss+xml" />
	<link>http://javadou.com</link>
	<description>Java</description>
	<lastBuildDate>Thu, 12 Aug 2010 09:01:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>你所不知道的提高spring+hibernate性能的一个方法</title>
		<link>http://javadou.com/spring-hibernate-autocommit-xing-neng-504/</link>
		<comments>http://javadou.com/spring-hibernate-autocommit-xing-neng-504/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 09:13:56 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[autocommit]]></category>
		<category><![CDATA[hibernate]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=504</guid>
		<description><![CDATA[在spring + hibernate的应用中，你监控mysql日志，你会发现大量的log如下： 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 Q... ]]></description>
			<content:encoded><![CDATA[<p>在spring + hibernate的应用中，你监控mysql日志，你会发现大量的log如下：</p>
<p>1. 158268 Query       SET autocommit=1<br />
2. 158268 Query       SET autocommit=1<br />
3. 158268 Query       SET autocommit=1<br />
4. 158268 Query       SET autocommit=0<br />
5. 158268 Query       commit<br />
6. 158268 Query       SET autocommit=1<br />
7. 158268 Query       SET autocommit=1<br />
8. 158268 Query       SET autocommit=1<br />
9. 158268 Query       SET autocommit=0<br />
10. 158268 Query       commit</p>
<p>158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=0<br />
158268 Query       commit<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=0<br />
158268 Query       commit</p>
<p>另外，你如果看mysqlreport，你会发现set_option和commt几乎占了mysql query的一半！！</p>
<p>原因是？</p>
<p>我们先看第一个问题：</p>
<p>1. 158268 Query       SET autocommit=0<br />
2. 158268 Query       commit</p>
<p>158268 Query       SET autocommit=0<br />
158268 Query       commit</p>
<p>这种日志产生的原因是hibernate查询时，如果所请求的对象在cache中，那么hibernate仍然会向数据库发出这样的两个sql语句。</p>
<p>再来看第二个问题</p>
<p>1. 158268 Query       SET autocommit=1</p>
<p>158268 Query       SET autocommit=1</p>
<p>这是因为当connection 被放回conn pool时，conn pool会恢复此连接取出时的autocommit状态。一般连接池里面的autocommit状态为true，所以每个查询都会紧跟着一个set autocommit＝1。</p>
<p>对第一个问题我们的解决方案：</p>
<p>那就是利用LazyConnectionDataSourceProxy</p>
<p>这个conn 代理的作用就是，只有当确实有必要时，他它向DB发出查询。一切没有必要的set autocommit=0 commit语句都不会发向数据库。</p>
<p>此class的详细作用请参见spring 文档</p>
<p>example配置如下:</p>
<p>1. &lt;bean id=&#8221;dataSourceTarget&#8221; destroy-method=&#8221;close&#8221;&gt;<br />
2.   &lt;property name=&#8221;driverClass&#8221;&gt;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;&lt;/property&gt;<br />
3.   &lt;property name=&#8221;jdbcUrl&#8221;&gt;&lt;value&gt;jdbc:mysql<br />
4. ://localhost:3306/imagedb&lt;/value&gt;&lt;/property&gt;<br />
5.   &lt;property name=&#8221;user&#8221;&gt;&lt;value&gt;admin&lt;/value&gt;&lt;/property&gt;<br />
6.   &lt;property name=&#8221;password&#8221;&gt;&lt;value&gt;&lt;/value&gt;&lt;/property&gt;<br />
7.<br />
8.  &lt;property name=&#8221;initialPoolSize&#8221; value=&#8221;60&#8243; /&gt;<br />
9.         &lt;property name=&#8221;minPoolSize&#8221; value=&#8221;50&#8243; /&gt;<br />
10.         &lt;property name=&#8221;maxPoolSize&#8221; value=&#8221;80&#8243; /&gt;<br />
11.         &lt;property name=&#8221;maxIdleTime&#8221; value=&#8221;7200&#8243; /&gt;<br />
12.<br />
13.         &lt;property name=&#8221;idleConnectionTestPeriod&#8221; value=&#8221;360&#8243; /&gt;<br />
14.         &lt;property name=&#8221;preferredTestQuery&#8221; value=&#8221;select 1&#8243; /&gt;<br />
15.         &lt;property name=&#8221;acquireIncrement&#8221; value=&#8221;5&#8243; /&gt;<br />
16.         &lt;property name=&#8221;acquireRetryAttempts&#8221; value=&#8221;50&#8243; /&gt;<br />
17.         &lt;property name=&#8221;acquireRetryDelay&#8221; value=&#8221;1000&#8243; /&gt;<br />
18.         &lt;property name=&#8221;breakAfterAcquireFailure&#8221; value=&#8221;true&#8221; /&gt;<br />
19.<br />
20.         &lt;!&#8211;property name=&#8221;checkoutTimeout&#8221; value=&#8221;1000&#8243; /&#8211;&gt;<br />
21.<br />
22.         &lt;property name=&#8221;autoCommitOnClose&#8221; value=&#8221;false&#8221; /&gt;<br />
23.         &lt;property name=&#8221;forceIgnoreUnresolvedTransactions&#8221; value=&#8221;false&#8221; /&gt;<br />
24.         &lt;property name=&#8221;unreturnedConnectionTimeout&#8221; value=&#8221;1000&#8243; /&gt;<br />
25.<br />
26.         &lt;property name=&#8221;maxStatements&#8221; value=&#8221;0&#8243; /&gt;<br />
27.         &lt;property name=&#8221;maxStatementsPerConnection&#8221; value=&#8221;0&#8243; /&gt;<br />
28.<br />
29.         &lt;property name=&#8221;testConnectionOnCheckin&#8221; value=&#8221;true&#8221; /&gt;<br />
30.         &lt;property name=&#8221;testConnectionOnCheckout&#8221; value=&#8221;false&#8221; /&gt;<br />
31.         &lt;property name=&#8221;usesTraditionalReflectiveProxies&#8221; value=&#8221;false&#8221; /&gt;<br />
32.<br />
33.         &lt;property name=&#8221;numHelperThreads&#8221; value=&#8221;5&#8243; /&gt;<br />
34. &lt;/bean&gt;<br />
35.<br />
36. &lt;bean id=&#8221;dataSource&#8221;&gt;<br />
37.   &lt;property name=&#8221;targetDataSource&#8221;&gt;&lt;ref local=&#8221;dataSource&#8221;/&gt;&lt;/property&gt;<br />
38. &lt;/bean&gt;</p>
<p>&lt;bean id=&#8221;dataSourceTarget&#8221; destroy-method=&#8221;close&#8221;&gt;<br />
&lt;property name=&#8221;driverClass&#8221;&gt;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;jdbcUrl&#8221;&gt;&lt;value&gt;jdbc:mysql<br />
://localhost:3306/imagedb&lt;/value&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;user&#8221;&gt;&lt;value&gt;admin&lt;/value&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;password&#8221;&gt;&lt;value&gt;&lt;/value&gt;&lt;/property&gt;</p>
<p>&lt;property name=&#8221;initialPoolSize&#8221; value=&#8221;60&#8243; /&gt;<br />
&lt;property name=&#8221;minPoolSize&#8221; value=&#8221;50&#8243; /&gt;<br />
&lt;property name=&#8221;maxPoolSize&#8221; value=&#8221;80&#8243; /&gt;<br />
&lt;property name=&#8221;maxIdleTime&#8221; value=&#8221;7200&#8243; /&gt;</p>
<p>&lt;property name=&#8221;idleConnectionTestPeriod&#8221; value=&#8221;360&#8243; /&gt;<br />
&lt;property name=&#8221;preferredTestQuery&#8221; value=&#8221;select 1&#8243; /&gt;<br />
&lt;property name=&#8221;acquireIncrement&#8221; value=&#8221;5&#8243; /&gt;<br />
&lt;property name=&#8221;acquireRetryAttempts&#8221; value=&#8221;50&#8243; /&gt;<br />
&lt;property name=&#8221;acquireRetryDelay&#8221; value=&#8221;1000&#8243; /&gt;<br />
&lt;property name=&#8221;breakAfterAcquireFailure&#8221; value=&#8221;true&#8221; /&gt;</p>
<p>&lt;!&#8211;property name=&#8221;checkoutTimeout&#8221; value=&#8221;1000&#8243; /&#8211;&gt;</p>
<p>&lt;property name=&#8221;autoCommitOnClose&#8221; value=&#8221;false&#8221; /&gt;<br />
&lt;property name=&#8221;forceIgnoreUnresolvedTransactions&#8221; value=&#8221;false&#8221; /&gt;<br />
&lt;property name=&#8221;unreturnedConnectionTimeout&#8221; value=&#8221;1000&#8243; /&gt;</p>
<p>&lt;property name=&#8221;maxStatements&#8221; value=&#8221;0&#8243; /&gt;<br />
&lt;property name=&#8221;maxStatementsPerConnection&#8221; value=&#8221;0&#8243; /&gt;</p>
<p>&lt;property name=&#8221;testConnectionOnCheckin&#8221; value=&#8221;true&#8221; /&gt;<br />
&lt;property name=&#8221;testConnectionOnCheckout&#8221; value=&#8221;false&#8221; /&gt;<br />
&lt;property name=&#8221;usesTraditionalReflectiveProxies&#8221; value=&#8221;false&#8221; /&gt;</p>
<p>&lt;property name=&#8221;numHelperThreads&#8221; value=&#8221;5&#8243; /&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;bean id=&#8221;dataSource&#8221;&gt;<br />
&lt;property name=&#8221;targetDataSource&#8221;&gt;&lt;ref local=&#8221;dataSource&#8221;/&gt;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>第二个问题的解决方案：</p>
<p>通过conn pool 的jdbc url把autocommit设为false来解决，不过mysql driver好像不支持这个设置。</p>
<p>另外，如果你使用的是mysql，那么第一个问题还有一个更简单的解决方案，那就是在jdbcUrl中加入</p>
<p>useLocalSessionState=true</p>
<p>这可以达到和</p>
<p>1. LazyConnectionDataSourceProxy</p>
<p>LazyConnectionDataSourceProxy</p>
<p>一样的效果</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/spring-hibernate-autocommit-xing-neng-504/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
