发表于: 2017-10-14 23:11:25
1 759
今日完成:
昨天问题已经解决,首先原来使用代码如下
@Autowired
private SqlSessionFactory sqlSessionFactory;
public void add(Emp emp){
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.emp.add", emp);
sqlSession.commit();
sqlSession.close();
}
这样是从IOC中取出SqlSessionFactory,在tomcat启动后,SqlSessionFactory实例化,SqlSessionFactory实现的是SqlSesssionFatoryBean子类,在每一次进行增删改查时,都会通过openSession来从连接池里取出一个连接
这里原因,sqlSession.close()提交后,连接仅在该方法内关闭,取出的连接并没有被连接池回收,造成连接池被占满状态,从而增删改查服务器会一直等待响应!
解决方案如下
<!--spring和Mybatis整合-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="prototype">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
整合后的使用SqlSessionTemplate来直接注册sqlSession,这样就既避免了我连接无法提交关闭而造成连接池被占满,又简化了Dao层代码,避免了重复的commit提交操作,和close关闭请求操作!
@Autowired
private SqlSession sqlSession;
public void add(Emp emp){
sqlSession.insert("test.emp.add", emp);
}
这样在调用sqlSession.insert就等同于调用SqlSessionTemplate.insert,其内部调用sqlSessionProxy.insert,sqlSessionProxy是一个动态代理器,其调用处理器是SqlSessionInterceptor,该处理器先getSqlSession,然后执行insert,最后closeSqlSession。
经测试,OK!
但是,这边整合框架时我参考了ssh框架整合,dao层处理的这种方式在常见ssm框架整合中,很是非主流....所以出了问题解决起来很吃力,这里dao层采用常规方式再次进行整理.
这里也先推荐非常好的一篇博客,讲的是非常清晰透彻!
http://blog.csdn.net/zhshulin/article/details/37956105
这里重写了Dao,并在配置文件中添加扫描注入
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入SqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描的Dao接口-->
<property name="basePackage" value="cn.ssm.dao"/>
</bean>
public interface MybatisDao {
public void add(Emp emp);
public void delete(Emp emm);
public void update(Emp emp);
public List<Emp> findAll();
public Emp findById(int id);
public Emp findByEmp(Emp emp);
}
这里要注意的是映射文件中的namespace要对应dao java文件的路径,方法id要对应dao中方法名称,这里测试欧克!
@Service
public class MybatisService {
@Autowired
private MybatisDao mybatisDao;
public void add(Emp emp){
mybatisDao.add(emp);
}
public void delete(Emp emp){
mybatisDao.delete(emp);
}
public void update(Emp emp){
mybatisDao.update(emp);
}
public List<Emp> findAll(){
return mybatisDao.findAll();
}
public Emp findById(int id){ return mybatisDao.findById(id);};
public Emp findByEmp(Emp emp){ return mybatisDao.findByEmp(emp);};
}
这里controller中也尽量使用了restful风格代码如下
@Controller
@RequestMapping(value = "/Desk")
public class FirstDemo {
@Autowired
public MybatisService mybatisService;
//处理注册请求后跳转至登录页面
@RequestMapping(value = "/Emp",method = RequestMethod.POST)
public String addEmp(Emp emp){
if (emp!=null){
mybatisService.add(emp);
}
return "redirect:/login.jsp";
}
//处理登录成功后跳转到展示方法
@RequestMapping(value = "/Emplogin",method = RequestMethod.POST)
public String login(HttpServletRequest request,Emp emp){
String str = "/login.jsp";
try {
Emp temp = mybatisService.findByEmp(emp);
if (temp!=null) {
//验证登录成功后,将temp放入session域中
request.getSession().setAttribute("emplogin",emp);
str = "/Desk/EmpList";
}
}catch (Exception e){}
return str;
}
//展示方法,获取所有用户并跳转至展示页面
@RequestMapping(value = "/EmpList")
public String listEmp(Model model,HttpServletRequest request){
List<Emp> list = mybatisService.findAll();
model.addAttribute("emplist", list);
return "/WEB-INF/list.jsp";
}
//处理跳转至更新页面请求
@RequestMapping(value = "/Emp/UpdateUI",method = RequestMethod.GET)
public String updateUI(Model model,int id){
Emp emp = mybatisService.findById(id);
model.addAttribute("emp",emp);
return "/updateUI.jsp";
}
//处理更新请求并跳转至展示方法
@RequestMapping(value = "/Emp/Update",method = RequestMethod.POST)
public String updateEmp(Model model,Emp emp){
mybatisService.update(emp);
return "/Desk/EmpList";
}
//处理删除用户请求并跳回展示方法
@RequestMapping(value = "/Emp/Delete",method = RequestMethod.GET)
public String deleteEmp(int id){
Emp emp = mybatisService.findById(id);
mybatisService.delete(emp);
return "/Desk/EmpList";
}
}
至此,ssm框架 简陋配置完成!
步骤4完成
步骤5 http://blog.csdn.net/u011054333/article/details/50958486
按照该博客下 先加载jetty插件,再配置jetty内容
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.7.v20160115</version>
<configuration>
<httpConnector>
<port>8080</port>
<host>localhost</host>
</httpConnector>
<scanIntervalSeconds>1</scanIntervalSeconds>
</configuration>
</plugin>
一次性成功!
这里已经移除了tomcat服务器哦.
虽然jetty作用相当于tomcat但是还是阐述一下什么是jetty
Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。
除此外使用常规的使用idea部署到jetty,下载压缩包解压到d盘下.
添加文件
添加项目至jetty服务器中.
关于jetty和tomcat的区别还有底层实现,https://www.ibm.com/developerworks/cn/java/j-lo-jetty/ 这篇11年的文章将的很好,只啃了一点点
步骤6 这里先是使用了Postman 进行测试,https://zhidao.baidu.com/question/1241375008598742699.html安装教程如下.还是比较麻烦的.
页面测试想当友好,在post请求,参数内容添加在body中. 但就目前感受来看,方便在于一次请求操作后会被保存在History历时记录中,调试过程中省去了一直开web浏览器重新输入的麻烦的其他功能还有待学习使用!
DHC测试类似,但就友好度来说postman更加好一点,用起来也舒服一点.
明日计划:完成深度思考,再再再回顾rest
问题:无
收获:新服务器的学习部署,及接口测试工具!
评论