1. 起因
最近現(xiàn)場反應(yīng)系統(tǒng)中的一個查詢功能的查詢速度很慢,自己也比較奇怪,因為自從第一版使用之后,最底層的查詢邏輯一直沒有改變,到網(wǎng)上發(fā)現(xiàn)也有不少人有這個問題,但是卻沒有實質(zhì)性的解決方案,有的說的是關(guān)聯(lián)查詢比較多,有的人說查詢語句比較復(fù)雜,但是當(dāng)時再寫的時候就考慮到這些,所以基本都是單個實體的查詢,但是確實是比較卡頓的。
2.思考
有一個帖子中的兄弟說的話給我一個啟發(fā),在最終的解決中他說他的緩慢是由于連續(xù)開了好幾個session
導(dǎo)致的,當(dāng)然我自己的代碼里沒這么寫,但是估計應(yīng)該也和Session
有關(guān),因為一直使用的是hibernate自帶的連接池,估計可能是業(yè)務(wù)量大了,畢竟Session
的開啟還是很耗費(fèi)資源的,那就加個連接池吧
3.解決
本來想就加個druid
,但是木有找到和hibernate
整合的例子,畢竟自己的hibernate
領(lǐng)導(dǎo)定的時候只是3.0。
還是決定直接用個c3p0
吧,我的項目的JDK1.6
hibernate3.0
就直接上了最新的
c3p0下載
把下圖的兩個jar
包引入項目就行了
image.png
也給出我的hibernate.cfg.xml
配置
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 最小連接數(shù) -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 最大連接數(shù) -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 獲得連接的超時時間,如果超過這個時間,會拋出異常,單位毫秒 -->
<property name="hibernate.c3p0.timeout">120</property>
<!--JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量。但由于預(yù)緩存的statements
屬于單個connection而不是整個連接池。所以設(shè)置這個參數(shù)需要考慮到多方面的因素。
如果maxStatements與maxStatementsPerConnection均為0,則緩存被關(guān)閉。Default: 0-->
<property name="hibernate.c3p0.max_statements">100</property>
<!--maxStatementsPerConnection定義了連接池內(nèi)單個連接所擁有的最大緩存statements數(shù)。Default: 0 -->
<property name="hibernate.c3p0.maxStatementsPerConnection">100</property>
<!-- 每隔120秒檢查連接池里的空閑連接 ,單位是秒-->
<property name="hibernate.c3p0.idle_test_period">120</property>
<!-- 當(dāng)連接池耗盡,且未達(dá)到最大連接數(shù)時,一次獲取的連接數(shù) -->
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<!--最大空閑時間,25000秒內(nèi)未使用則連接被丟棄。若為0則永不丟棄。Default: 0 -->
<property name="hibernate.c3p0.maxIdleTime">25000</property>
<!--初始化時獲取10個連接,取值應(yīng)在minPoolSize與maxPoolSize之間。Default: 3 -->
<property name="c3p0.initialPoolSize">10</property>
<!--連接關(guān)閉時默認(rèn)將所有未提交的操作回滾。Default: false -->
<property name="autoCommitOnClose">false</property>
<!--c3p0將建一張名為c3p0_test的空表,并使用其自帶的查詢語句進(jìn)行測試。如果定義了這個參數(shù)那么
屬性preferredTestQuery將被忽略。你不能在這張Test表上進(jìn)行任何操作,它將只供c3p0測試
使用。Default: null-->
<property name="automaticTestTable">c3p0_test</property>
<!--定義在從數(shù)據(jù)庫獲取新連接失敗后重復(fù)嘗試的次數(shù)。Default: 30 -->
<property name="acquireRetryAttempts">30</property>
4.結(jié)果
再使用連接池前執(zhí)行一個sql
大概 1.8秒
image.png
之后大概 0.07秒
image.png