原标题:Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记
来源:hengyunabc,
blog.csdn.net/hengyunabc/article/details/7722147
一、前言:
以前刚开始用Java连接MySQL时,都是连猜带蒙的。比如:
一个Statement,Connection何时关闭?
Connection能不能先于Statement关闭?
ResultSet是怎样存放数据的?怎样才能高效操纵ResultSet?
PrepareStatement到底是怎样回事?
连接池是怎样工作的?
二、从JDBC driver代码分析:
在性能要求高的地方,应当使用ResultSet.get**(int)系列函数
如ResultSet.getBytes(String columnName),
则会先会调用findColumn(columnName)去查找到columnName对应的index是什么,而在findColumn(columnName)函数中,
会检查索引有没有构建好了,如果还没有则要构建columnName对应的索引。
所以,如果对性能要求,则应该使用ResultSet.getBytes(int column)函数。
PreparedStatement的缓存及重用
对于PreparedStatement,会有一个LRUCache来存放,会先到里面去取,拿不到再创建一个新的。
这个LRUCache的默认大小是25(太小了吧。。)。对于sql长度,如果大于256的,貌似则不缓存这个PreparedStatement。
LRUCache很简单,代码:
public class LRUCache extends LinkedHashMap {
protected int maxElements;
public LRUCache(int maxSize) {
super(maxSize);
this.maxElements = maxSize;
}
protected boolean removeEldestEntry(Entry eldest) {
return (size() > this.maxElements);
}
LinkedHashMap在每次put和putAll后,会调用removeEldestEntry来判断是否要移除最老的Entry。
LinkedHashMap的实现也比较简单,里面用双向链表把所有的Entry串在一起,当调用get时,把get所在的key移到链表的最前面。
PreparedStatement是如何实现重用的ÿ