JPA性能调优简介
(主要参考Hibernate和EclipseLink的文档。)
Fetching strategies
对于entity的association到底应该lazy fetch还是eager fetch。 需要为不同的场景指定合适的fetch策略。 不该eager的时候eager fetch费内存;不该lazy的时候lazy fetch会增加和数据库间的通信次数。
The Hibernate recommendation is to statically mark all associations lazy and to use dynamic fetching strategies for eagerness. This is unfortunately at odds with the JPA specification which defines that all one-to-one and many-to-one associations should be eagerly fetched by default. Hibernate, as a JPA provider, honors that default.
Hibernate推荐把association的fetch策略先定义为lazy的(statically,比如@ManyToOne(fetch = FetchType.LAZY)
),
然后在需要eager fetch的时候再动态地指定fetch策略。
比如可以通过JPQL或者Criteria以Fetch Join的方式来eager fetch,
SELECT mag FROM Magazine mag LEFT JOIN FETCH mag.articles WHERE mag.id = 1
-- 如果不想返回重复结果,可以加上DISTINCT
builder.createQuery(Employee.class).from(Employee.class).fetch("projects", JoinType.LEFT)...
通过entity graph(@NamedEntityGraph
)或者Hibernate profile(@FetchProfile
)可以为不同的场景指定fetch的策略。
另外,在lazy fetch的情况下,还可以通过指定batch size来减少fetch的次数。
Pagination
如果结果集太大,则考虑通过setFirstResult()
和setMaxResults()
以“分页”的方式来返回结果集。
工具推荐:TitleCap
推荐一个可以自动将英文标题首字母大写的工具。 支持多种首字母大写规则,包括Chicago Manual of Style,
- Always capitalize the first and the last word.
- Capitalize all nouns, pronouns, adjectives, verbs, adverbs, and subordinate conjunctions (“as”, “because”, “although”, “if”, etc.).
- Lowercase all articles, coordinate conjunctions (“and”, “or”, “nor”), and prepositions regardless of length, when they are other than the first or last word.
- Lowercase the “to” in an infinitive.
Here Documents
A here document is a special-purpose code block. It uses a form of I/O redirection to feed a command list to an interactive program or a command, such as ftp, cat, or the ex text editor.
除了interactive program,一些non-interactive program也支持heredoc。vi也支持heredoc。
Choose a limit string sufficiently unusual that it will not occur anywhere in the command list and confuse matters.
The closing limit string, on the final line of a here document, must start in the first character position. There can be no leading whitespace. Trailing whitespace after the limit string likewise causes unexpected behavior. The whitespace prevents the limit string from being recognized.
The - option to mark a here document limit string («-LimitString) suppresses leading tabs (but not spaces) in the output. This may be useful in making a script more readable.
limit string的前后都不要加空格。否则会遇到类似unexpected end of file之类的错误。
如果在脚本里用heredoc,为了缩进可以加上-
选项(<<-LimitString
),可以省略行开头的tab键。
For those tasks too complex for a here document, consider using the expect scripting language, which was specifically designed for feeding input into interactive programs.
太复杂的交互可以考虑用expect脚本来实现。
用sed直接修改原文件
sed提供了-i
选项可以“就地”(in-place)修改原始文件。
-i extension
Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended
to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
sed -i .bak -e 's/foo/bar/' pom.xml # 备份原始文件
sed -i '' -e 's/foo/bar/' pom.xml # 不做备份
# sed -i -e 's/foo/bar/' pom.xml # OS X下有“bug”,会生成名为pom.xml-e的备份文件
在文本编辑器里显示空白字符
下午同事遇到一个bug,数据库始终连接不上。 网络检查正常(用数据库的client可以正常连接)、配置文件也是“正常的”(和其他可以正确连接的同事的配置“一摸一样”)。 最后发现是配置文件中的数据库密码的结尾多了几个空格😓。
所以最好在编辑器/IDE里显示空白字符。绝大部分编辑器都是支持空白字符显示的,包括Vim。
另一个空格相关的bug。
Responsive Web Design
来自Google的Responsive Web Design指南。 讲了实现Responsive Design相关的CSS知识。
这篇指南是Web Fundamentals系列中一篇。整个Web Fundamentals系列都值得一看。
杠杆
而一个刚入行的 Golang 工程师,每天的任务就是写作 Go 的标准库,今天写 http 明天写 sort,写的比 Pike 多很多。 考核时,高级工程师因为带领着高效团队,每季度 OKRs 上都有诸多亮点;而刚入行的工程师,只能报告一些比较琐碎的成就。
这个观察近乎于常识,然而对于当时的我来说是一个顿悟:做出 MapReduce 框架的和写琐碎 MapReduce 程序的工程师之间的差距并不是他们的工具和编程效率, 也往往不是教育背景或者经验,而是他们各自的杠杆:所带领的团队。
问题是,没有人会给你这个杠杆。于是,我开始观察别人的杠杆是怎么搭建的。
收购一个产品并做大它
I Bought a Company That Makes Me $30,000 a Month. Here’s How.
作者为自己的网店购买了一个Shopify app后,发现销售额一下子增加了1400美元,进而联系app的作者收购了这个app。 收购后,通过一些营销:
- 发信给app的用户,如果他们觉得这个app有帮助,请求他们在app store留下好评。新增的好评提升了app的排名。
- 改进app在app store上的介绍页面。改进之后,每日安装量大概提升了15%。
- 在reddit,Facebook groups,Quora和Shopify论坛上(间接地)做一些推广。收效一般。
- 通过auto-email等手段了解用户的行为,比如为什么取消订阅,educate用户高效地使用app。
- 做大app,移植到其它商店。
效果:
logging over $511,913 in direct sales from the Notify platform.
Cross-Site Scripting (XSS)
来自Ruby on Rails Security Guide的一个章节,内容基本上是和特定web框架无关的,推荐一读。