慢SQL,压垮团队的最后一根稻草
作者:CQITer小编 时间:2018-04-16 21:56
先说结论,我支持将逻辑写在 Java 等应用系统中。

背景:
今天只讨论一种应用模式,就是最普遍的,前端实时调用后端web服务,服务端经过DB的增删改查作出响应的应用。至于离线数据分析,在线规则引擎模板执行,流式计算等不在本次讨论范畴。
重SQL开发的场景
先看一个例子吧。用经典的 Controller Service DAO 开发模式描述。

需求:
查询出每个学生所在的城市名以及分数展示到前端。
重SQL模式
class Controller{
Service service;
Map<String,String> get(Map<String,Object> param){
return service.get(param);
}
}
class Service{
DAO dao;
Map<String,String> get(Map<String,Object> param){
return dao.get(param);
}
}
class DAO{
SQLTemplate template;
Map<String,String> get(Map<String,Object> param){
String sql = "select city_name,student_name,score from student,score,city where city.city_code=student.city_code and score.student_id=student.student_id" ;
return template.execute(sql,param);
}
}
重Java模式
class View{
String studentName;
String cityName;
String score;
}
class Requent{
}
class Controller{
Service service;
List<View> get(Requent request){
return service.get(param);
}
}
class Service{
StudentDAO studentDAO;
ScoreDAO scoreDAO;
CityDAO cityDAO;
List<View> get(Requent param){
Student studentRequest = new Student();
//查询学生
List<Student> students = studentDAO.select(studentRequest);
List<View> result = new ArrayList(students.size());
for(Student student : students){
View view = new View();
view.setStudentName(student.getStudentName());
//拼接城市名
City cityRequest = new City();
cityRequest.setStudentId(student.getStudentId());
City city = cityDAO.select(cityRequest);
view.setCityName(city);
//拼接分数
Score scoreRequest = new Score();
scoreRequest.setStudentId(student.getStudentId());
Score score = scoreDAO.select(scoreRequest);
view.setScode(score.getScore());
result.add(view);
}
return result;
}
}
class StudentDAO{
SQLTemplate template;
Student select(Student param){
String sql = "select * from Student where param = ...";
template.select(sql,param);
}
}
class ScoreDAO{
SQLTemplate template;
Score select(Score param){
String sql = "select * from Score where param = ...";
template.select(sql,param);
}
}
class CityDAO{
SQLTemplate template;
City select(City param){
String sql = "select * from City where param = ...";
template.select(sql,param);
}
}


