公司原有项目中,因为以前赶时间,有些地方做的稍微粗糙了一些,某些地方存在 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);
结果一运行,代码妥妥地 阅读全文…
最近玩一个 Rails 项目,项目中使用了 PostgreSQL 数据库,正好借此也了解一下 PostgreSQL 。
对于 Ubuntu 系统,阮一峰老师的文章已经非常详细地介绍了关于 PostgreSQL 的安装使用。但是,在 Mac 上有些细节却不是很适用。在上网找资料的时候,各种资料也是零零碎碎,查找起来极不方便。正好整理成文,分享出来,方便自己,也方便需要的朋友参考。
坑已经挖好。听口令:预备,跳……
Homebrew 安装
工欲善其事,必先利其器。D瓜哥准备用 Homebrew 安装 PostgreSQL。所以,我们先来介绍一下 Homebrew 。Homebrew 可以说是 Mac 上居家旅行之必备神器!上可以装软件,下可以一键更新,实乃方便至极!
这样的神器,安装也非常简单,这么娇艳欲滴,实在让人爱不释手啊:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
其实,本来不想加上 Homebrew 的安装了 阅读全文…
上周三(2014年11月5日)公司搞入职培训,所讲的一些东西和我关注的东西有点“不谋而合”,感觉很爽;周四蔡导(当然就是讲师了)把讲座的PPT群发到技术部邮件组里,参与讨论时,我就询问想推荐一些书,看大家感不感兴趣,结果不少人回应很“激烈”。到周五(2014年11月7日)在公司技术群里求推荐好书,又掀起来一波热潮。大家推荐了不少好书。中国向来是礼仪之邦,正所谓来而不往非礼也!D瓜哥也来推荐一些书。
上面是废话,下面开始转入正题。
推荐原则
从去年找工作,甚至再往前,从上大学开始,到现在为止,翻过不少书(好多没看完,姑且叫翻吧),运气还算不错,确实遇到一些不错的好书,值得反复阅读,细细品味。不过,一次太多,容易把人吓着,所以,暂且推荐十本吧。
另外,这次的介绍主要是面向公司内部同事,考虑到公司所用技术方向,也为了照顾大多数人,推荐的书籍大部分不限于某一语言。不过,因为本人几乎一直从事Java开发,所以,相对来说可能稍微侧重一些;另外,因为从来没有从事过PHP的开发(为了优化博客,折腾Wordpress不算),所以不推荐专门的PHP相关书籍。
最后一个,也是最重要的原则:D瓜哥看过、试过之后有一种“醍醐灌顶”的“顿悟”感。(当然,D瓜哥水平有限,所以“顿悟”的可能比较频繁。这个,牛人、大拿可以直接飞过去了。呵呵)
先说明一下,这本书的代码是用C#实现的,搞C#的人可以先高兴一下。
不过,代码都很浅显易懂,可以很方便地“迁移”到其他语言了。所有的技术人员都可以高兴一下了。哈哈
引用本书中的一句话:如果说数学是思维的体操,那么设计模式就是 阅读全文…
分类: Java, 动态语言, 挨踢(IT), 数据库, 职场生涯, 轶事趣闻 标签: Java, MySQL, Ruby, 性能, 数据库, 程序员
数据库对于服务端开发人员来说,几乎就是左膀右臂。几乎每一个服务端开发人员都要和数据库打交道。而MySQL又以其开源免费,小巧玲珑,简单易用,功能强大占据中国数据库使用份额的半壁江山。从去年接触到Vagrant以来,Vagrant以其方便易用深深吸引了D瓜哥。为了尽可能地和生产环境保持尽可能的一致性,减少不必要的问题的发生,Vagrant+Ubuntu+MySQL几乎是绝配。
MySQL允许远程访问的设置
-
注释bind-address = 127.0.0.1
>cd /etc/mysql
>sudo vim my.cnf
将 阅读全文…
2013年已经过完了。在2013年里,对D瓜哥来说最重要的一件事情就是面试,长达半年的面试(2013年5月10日离职到2013年11月15日上班)。至于找工作的时候经常玩,这种丢脸的事情,我会到处张扬吗?别人都去写年末总结了,D瓜哥也想写,但是还没动手。所以,滥竽充数,把以前面试时整理的一些面试题拿出来权当年末总结吧。这是D瓜哥2013年10月18日面试时,被问的问题和“昨天面试被问到的一些问题”有不少区别的,而且也确实有一些是我自己不太确定或者说研究得不够透彻。所以, 阅读全文…
分类: Java, Linux, 挨踢(IT), 数据库, 职场生涯 标签: HTTP, Java, JavaScript, Linux, Network, Web, 数据库, 面试
昨天D瓜哥参加了一个Java工程师面试,具体公司名称就不透露了。感觉被问的问题挺有代表性。简单整理一下,发布出来,给需要的朋友一个参考吧。暂时没有解答,抱歉!
-
以前工作中收获最大的一次经历是什么?
这里只说明一下收获吧。
- 高性能网站的十四条黄金法则
- 高性能JavaScript
-
所需知识哪些 阅读全文…
动员令
您有没有因小小的MySQL支撑互联网80%以上的业务而惊奇?您有没有觉得MySQL是多么神秘而美丽?您有没有为开源贡献一份力量的热心?您有没有意识到翻译一份中文版本的MySQL文档的重要性?帮助更多的人学习和提高,从手册开始。
请加入我们!将 MySQL5.6 的手册 翻译成我们的母语中文,让全世界五分之一的人口不再因为MySQL文档是英文的而蛋疼!(考虑到性别因素,可能是十分之一,:))让全世界五分之一的人口可以使用自己的母语阅读MySQL手册!
我们的目标是翻译 MySQL 5.6 的手册。我们的核心是以译促学,提高自身MySQL技能。既可以为开源社区做贡献,又可以提高自身知识水平。一举俩得,何乐而不为?
初步计划
道之所存,虽千万人吾往矣!我们计划 阅读全文…
多表关联下的测试数据制造方法系列
- 多表关联下的测试数据制造方法(一):思路详解
- 多表关联下的测试数据制造方法(二):将数据导出为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瓜哥自己独立思考出来的!共享出来,希望能解决大家在制造测试数据时,遇到的烦恼。当然,如果您有更好的方案,欢迎共享出来,相互学习学习。废话少说,转入正文。
单表备份
在讲解复杂情况之前,我们先从最简单的情况说起。最简单的情况莫过于 阅读全文…