Query.list()方法查詢速度緩慢

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

但是 我TM最后發(fā)現(xiàn) 當(dāng)我把SQLServer數(shù)據(jù)庫重啟之后 發(fā)現(xiàn):加不加連接池大概都是0.0x秒,所以如果程序突然卡頓,特別對象是SQLServer數(shù)據(jù)庫 不妨先重啟看看

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • Hibernate: 一個持久化框架 一個ORM框架 加載:根據(jù)特定的OID,把一個對象從數(shù)據(jù)庫加載到內(nèi)存中OID...
    JHMichael閱讀 2,000評論 0 27
  • 目錄 1. Hibernate框架的概述 1.1 Hibernate簡介 1.2 為什么要學(xué)習(xí)Hibernate ...
    深海魚Q閱讀 1,044評論 0 14
  • 這部分主要是開源Java EE框架方面的內(nèi)容,包括Hibernate、MyBatis、Spring、Spring ...
    雜貨鋪老板閱讀 1,433評論 0 2
  • 常憶春堤煙柳,拂水勻黃透,一派垂絲逾春瘦。東風(fēng)起,醉前后,千頃金波皺。 何歡也、是番消受,今來盛跡皆依舊。仍須道、...
    姑射閱讀 368評論 1 5