Maven+ssm+IDEA实现简单的秒杀系统(二)

时间:2022-06-16 09:31:34

第一部分: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的优点
    Maven+ssm+IDEA实现简单的秒杀系统(二)
    Maven+ssm+IDEA实现简单的秒杀系统(二)
    Maven+ssm+IDEA实现简单的秒杀系统(二)
    Maven+ssm+IDEA实现简单的秒杀系统(二)
    Maven+ssm+IDEA实现简单的秒杀系统(二)
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}

第二部分:mybatis整合Spring
http://docs.spring.io/spring/docs/4.1.6.RELEASE/spring-framework-reference

①配置数据库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)