公司原有项目中,因为以前赶时间,有些地方做的稍微粗糙了一些,某些地方存在 N+1查询问题。最近这两个月再做一个新项目。所有,以前踩过的坑,希望这次能尽量避免。比如 N+1查询问题。
公司技术方面,Dao 层使用的是 Spring JdbcTemplate;数据库使用的是 MySQL。所以,关于这次的主题,D瓜哥 也只关注 Spring JdbcTemplate 和 MySQL。
从出坑到入坑
讲述解决办法之前,D瓜哥 先说明一下背景问题:一个订单 Order
中,会有多个订单元素 OrderItem
,在查看订单列表时,需要根据订单 ID 查询相关的订单元素信息。查询方式有两种:一、在循环中,每次循环根据一个订单 ID 查询一个订单对应的订单元素信息。这就是典型的 N+1查询问题。另外一种方式,根据查询出来的所有的订单 ID 一次查询出所有相关的订单元素信息。显然,第二种方式要比第一种方式效率上高很多。这是基本的背景问题。下面来说明一下 D瓜哥 在解决这个问题过程中犯的错误以及更好的解决办法。
看到上述问题时,D瓜哥的第一反应就是使用 IN
就可以很好地解决。开始噼里啪啦写代码:
String sql = " SELECT * " +
" FROM `order_item` " +
" WHERE order_id IN ( ? )";
List<OrderItem> orderItemList = getJdbcTemplate().query(sql, new BeanPropertyRowMapper<OrderItem>(OrderItem.class), orderItemArray);
结果一运行,代码妥妥地 阅读全文…
前两天上网,看到竟然可以使用阿里云。D瓜哥的“‘地瓜哥’博客网”访问速度实在是不给力。所以,准备搬到国内。因为在“博客园”上经常看到阿里云各种坑爹。所以,一直犹豫要不要买。正好借这个机会,试用一下,尝尝鲜。所以,果断申请试用。
目前考虑,准备在阿里云上搭建一个PHP环境用于存放博客。另外,搭建一套Rails环境,准备放点自己倒腾的东西。所以,果断选择Ubuntu 12.04系统(阿里云里面支持的最新版了,可惜没有14.04版)。
因为,一直没有自己搭建过PHP的运行环境。所以,记录一下这个过程,以备后用,也分享给喜欢倒腾的朋友。
更新系统
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bk
sudo vim /etc/apt/sources.list
然后, 阅读全文…
D瓜哥在2013年10月29日面试来一家公司。这次面试,被问的问题更加细致和深入,并且确实都是D瓜哥不太确定或者说研究得不够透彻的问题。记录下来,以备以后研究使用。
本次发布的面试有两三家公司的面试题。全部记录下来,就不做细致区分了。本次发布的面试题没有得到面试官到许可。如果相关人员看到了,觉得不方便发布的。请及时和D瓜哥联系。D瓜哥会立即撤下这篇文章。另外, 阅读全文…
昨天D瓜哥参加了一个Java工程师面试,具体公司名称就不透露了。感觉被问的问题挺有代表性。简单整理一下,发布出来,给需要的朋友一个参考吧。暂时没有解答,抱歉!
-
以前工作中收获最大的一次经历是什么?
这里只说明一下收获吧。
- 高性能网站的十四条黄金法则
- 高性能JavaScript
-
所需知识哪些 阅读全文…
动员令
您有没有因小小的MySQL支撑互联网80%以上的业务而惊奇?您有没有觉得MySQL是多么神秘而美丽?您有没有为开源贡献一份力量的热心?您有没有意识到翻译一份中文版本的MySQL文档的重要性?帮助更多的人学习和提高,从手册开始。
请加入我们!将 MySQL5.6 的手册 翻译成我们的母语中文,让全世界五分之一的人口不再因为MySQL文档是英文的而蛋疼!(考虑到性别因素,可能是十分之一,:))让全世界五分之一的人口可以使用自己的母语阅读MySQL手册!
我们的目标是翻译 MySQL 5.6 的手册。我们的核心是以译促学,提高自身MySQL技能。既可以为开源社区做贡献,又可以提高自身知识水平。一举俩得,何乐而不为?
初步计划
道之所存,虽千万人吾往矣!我们计划 阅读全文…
《Agile Web Development with Rails》抄书笔记系列
“《Agile Web Development with Rails》抄书笔记系列”目录
虽然上一节,我们创建了个一个初步在购物车,也通过了功能性验证。但是,这个购物车还有很多不完善的地方,比如,如果顾客添加了多个同一件商品,那么我们就需要重组这个购物车。这一节,我们将从这方面着手,来完善这个购物车。
D呱呱
关于这节内容的代码:
- 这节开始之前:https://github.com/diguage/depot/tree/v-09.3
- 这节完成之后:https://github.com/diguage/depot/tree/v-10.1
解决上面提到的这个问题,其实很简单只需要给 line_items表增加一个表示数量的列即可,我们将 阅读全文…
以前没有攒资料的习惯,这一两年才养成了这个习惯。有次和大学老师聊天,和她说攒了不少资料,她就让我分享给她看。后来和她进一步沟通,觉得整理一下,分给学弟学妹看也许对他们更有帮助。为了这个目标,把资料重新梳理了一下,并且添加了一点我个人对学习方法的理解,分享出来,希望对大家有所帮助!
本文章面向刚刚踏入挨踢行业的新手,高手可以直接飞过!当然,如果有好的资料,或者一些不同的看法,请留言交流!
学习方法论
- 享受学习!寻找学习中的乐子,享受这种乐子!强化学习中的成就感,提高自己对课程,对学习,对生活的自信心!在《只要一部计算机,就可以创造出 阅读全文…
分类: Java, Linux, Web开发, 挨踢(IT), 轶事趣闻 标签: Git, Java, JavaScript, Linux, Ruby, SQL, Web, jQuery, vim, 数据库, 程序员
多表关联下的测试数据制造方法系列
- 多表关联下的测试数据制造方法(一):思路详解
- 多表关联下的测试数据制造方法(二):将数据导出为CSV文件
在上一节,D瓜哥给大家介绍了一下如何使用存储过程,将数据导出成CSV文件。既然有数据文件了,我们该如何将这些数据导入到数据库中呢?!Oracle数据库提供了SQL Loader这样一个将数据文件导入到数据库中的功能。这篇文章将给大家介绍一下SQL Loader的用法。另外,再炒炒剩饭,把D瓜哥以前使用TCL语言写的脚本分享给大家。
SQL Loader简介
概念
SQL Loader是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQL Loader是大型数据仓库选择使用的加载方法,因为它提供了 阅读全文…
多表关联下的测试数据制造方法系列
- 多表关联下的测试数据制造方法(一):思路详解
上一节中,我们详细介绍了单表、多表关联等情况下,制造测试数据的思路,并用SQL、存储过程等测试了这些思路。这一节,D瓜哥讲继续上一节的思路,使用SQL Loader来提升导入数据的效率。
使用SQL Loader来导入数据时,必须提供有规范格式的数据文件。假设,我们的基础表已经有数据了。目前需要做的事,1、根据基础表生成数据文件;2、使用SQL Loader讲数据文件中的数据导入到数据汇总表。那么,问题就来了:我们如何生存数据文件呢?这一篇文章,我们就重点关注一下,如何根据查询结果生存数据文件的问题。
了解SQL的朋友应该都知道,使用SQL增删改查还行。如果让SQL读写文件,那真是鞭长莫及啊! 阅读全文…
声明一下,这个方案不一定最好!另外,这个方案也许不是D瓜哥首先发明的(D瓜哥只是想解决问题),但是绝对是D瓜哥自己独立思考出来的!共享出来,希望能解决大家在制造测试数据时,遇到的烦恼。当然,如果您有更好的方案,欢迎共享出来,相互学习学习。废话少说,转入正文。
单表备份
在讲解复杂情况之前,我们先从最简单的情况说起。最简单的情况莫过于 阅读全文…