1. 程式人生 > >Maven+ssm+IDEA實現簡單的秒殺系統(二)

Maven+ssm+IDEA實現簡單的秒殺系統(二)

第一部分:DAO實體和介面編碼

  1. 資料庫中欄位一般中間用下劃線,而實體類使用駝峰標識
  2. maven專案:org.sekill.entity(專案座標.)
  3. 單元測試時為了列印物件方便可以重寫物件的toString方法
  4. DAO是針對具體的實體來編寫,用mybatis來實現DAO(實現資料庫與物件之間的對映)
  5. xml提供sql,mapper自動實現Dao介面(SeckillDao.xml)
  6. 從官方文件中檢視配置檔案頭
  7. SeckillDao.xml為Dao方法提供sql語句配置
  8. select seckill_id as seckillId(用了駝峰命名轉換可以不用使用別名來轉換)
  9. insert語句,當主鍵衝突時會報錯,insert ignore into–>不報錯,返回0
  10. 告訴mybatis把結果對映到successKilled,同時對映到seckill
    11.mybatis的優點
    這裡寫圖片描述
    這裡寫圖片描述
    這裡寫圖片描述
    這裡寫圖片描述
    這裡寫圖片描述
SELECT sk.seckill_id,
                sk.user_phone,
                sk.create_time,
                sk.state,
                s.seckill_id "seckill.seckill_id",
                s.number "seckill.number",
                s.start
_time "seckill.start_time", s.end_time "seckill.end_time", s.create_time "seckill.create_time" FROM success_killed sk INNER JOIN seckill s on sk.seckill_id = s.seckill_id WHERE sk.seckill_id = #{seckillId}

①配置資料庫jdbc.properties
②配置資料庫連線池(基本屬性+c3po私有屬性)
③ 配置sqlSessionFactory物件 :注入資料庫連線池+配置mybatis全域性屬性+——更少配置——-》掃描entity包,使用別名+掃描sql配置檔案mapper需要的xml檔案
(java目錄和resources目錄下的檔案都是classpath)
④配置掃描Dao介面包——》動態實現dao介面,注入到spring容器中

第三部分:配置spring和junit整合,使得:junit啟動時載入SpringIoc容器 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({“classpath:spring/spring-dao.xml”})
測試中遇到的bug:c3p0資料庫連線池不能取到連線An attempt by a client to checkout a Connection has timed out

—-根本原因: 池中的連線已經被全部使用完了..達到了最大maxconn…從而導治這個錯誤…
—-其他原因:忘記close conn,或者異常了而沒有close conn,沒有釋放conn從池中。。…導治池中的conn滿的了…
解決辦法:
a.適當加大maxPoolSize和minPoolSize ,可以大大緩解這種情況。。
c3p0.maxPoolSize=5000
c3p0.minPoolSize=10
b.檢測程式碼 close conn..釋放conn…當然這個總是有遺漏.最小化這個影響就好..
c.自動超時回收Connection (強烈推薦)
c3p0.unreturnedConnectionTimeout=25
default : 0 單位 s
為0的時候要求所有的Connection在應用程式中必須關閉。如果不為0,則強制在設定的時間到達後回收Connection,所以必須小心設定,保證在回收之前所有資料庫操作都能夠完成。這種限制減少Connection未關閉情況的不是很適用。為0不對connection進行回收,即使它並沒有關閉。
d.配置超時自動斷開conn (推薦)
c3p0.maxIdleTimeExcessConnections=20
c3p0.maxConnectionAge=20
default : 0 單位 s
配置連線的生存時間,超過這個時間的連線將由連線池自動斷開丟棄掉。當然正在使用的連線不會馬上斷開,而是等待它close再斷開。配置為0的時候則不會對連線的生存時間進行限制。
e.最後,show full processlist ..檢視db conn數,,穩定後走ok…否則適當調整以上引數..
測試中遇到的bug: java沒有儲存形參的記錄 (int offset,int limit)——>(arg0,arg1)