泸州,Mysql Java 驱动代码阅览笔记及 JDBC 标准笔记,宫腔镜检查

知乎精选 admin 2019-04-11 384 次浏览 0个评论
网站分享代码

一前语:

曾经刚开始用Java衔接MySQL时,都是连猜带蒙的。比方:

一个Statement,Connection何时封闭?

Connection能不能先于Statement封闭?

ResultSet是怎样寄存数据的?怎样才能高效操作ResultSet?

PrepareStatement到底是怎样回事?

衔接池是怎样作业的?

二、从JDBC driver代码剖析:

在功能要求高的当地,应当运用ResultSet.get**(int)系列函数

如ResultSet.getBytes(String columnName),

则会先会调用findColumn(columnName)去查找到columnName对应的index是什么,泸州,Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记,宫腔镜查看而在findColumn(columnName)函数中,

会查看索引有没有构建好了,假如还没有则要构建columnName对应的索引。

所以,假如对功能要求,则应该运用ResultSet.getBytes(int c银olumn)函数。

PreparedStatement的缓存及重用

关于PreparedStatement,会有一个LRUCache来寄存,会先到里边去取,拿不到再创立一个新的。

这个LRUCache的默许巨细是25(太小了吧。。)。关于sql长度,假如大于256的,形似则不缓存这泸州,Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记,宫腔镜查看个PreparedStatement。

LRUCache很简单,代码:

Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记


LinkedHashMap在每次put和putAll后,会调用removeEldestEntry来判别是否要移除最老的Entry。

LinkedHashMap的完成也比较简单,里边用双向链表把一切的Entry串在一同,当调用get时,把get地点的key移到链表的最前面。

PreparedStatement是怎么完成重用的:

Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记


可见仅仅设置未封闭,再铲除Parameters。所以从代码上来说,咱们得泸州,Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记,宫腔镜查看到一个PreparedStatement在运用后,能够调用clearParameters,再接着运用。可是最好不要这样做。

假如是想要履行屡次,能够用addBatch和executeBatch函数来屡次履行。

关于CallableStatement和ServerPreparedStatement

CallableStatement,ServerPreparedStatemen奉节t承继自PreparedStatement,实践上prepareStatement(String sql)函数回来的便是ServerPreparedStatement,LRUCache中放的也是。

Callab猪猪侠之变身小英豪leStatement也有一个LRUcache。

实践受骗PreparedS精油按摩tatement调用close时,并没有真实释单反相机放掉资源,

Statement、Connection、ResultSet何时close

查看Statement的close函数代码,能够发现当cl腿绞ose时,这个Statement中一切的ResultSet也会被close。

查看Connection的close函数,当close时,这个Connection的一切Statement都会被close。

可是据JDBC4的规范,有或许当Statement封闭时,李润庭ResultSet中的资源未被彻底开释,当GC再次运行时才会收回。

所以最好便是次序封闭ResultSet,Statement,Connecti百骨夜宴on。

反常处理

SQLExc电工证查询eption是能够迭代的,应该用以下的代码来处理一切的反常:


在代码ganConnection类的许多当地,比方void clo蕊seAllOpenStatements()函数,能够看到这样的代码:


感觉这个是有问题的,由于把一些反常信息给丢掉了,实践上是能够迭代的,应该调用setNextException函数把反常都加到一同。

计算数量count:


代码中其它一些有意思的当地:

在代码中有很多的StringBuffer,而没有用StringBuilder,或许是要兼容JDK5的原因

装备都用一个ConnectionPro乾隆王朝perty类来表明,从这儿派生出子类,IntegerConnectionProperty,BooleanConnectionProperty什么的。

每一个装备有都默许值,描绘信息止咳糖浆,版别等。形似大部分在ConnectionProperties类中完成。

发现了代码中的一个bug,没有找到找交的当地,不是很重要就算了。

com.mysql.jdbc.ConnectionProperties类initializeFrom(String extractedValue)函数中:


三、从JDBC规范来看:

类型对照表:



留意:

在JDBC中要表明日期,是运用java.sql.Date,其日期格局是”年、月、日”;

要表明时刻的话则是运用java.sql.Time,其时刻格局为”时、分、秒”;

假如要表明”时、分、秒、微秒”的格局,则是运用java.sql.Timestamp

衔接池或许会主动封闭之前的connection!

要留意运用衔接池时,据JDBC规范:

A single physical PooledCon泸州,Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记,宫腔镜查看nection object may generate many神龙斗士 logical

Connecti天国的嫁衣on objects during i泸州,Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记,宫腔镜查看ts lifetime. For a given PooledConnection object,

only the most recently produced logical Connection object will be valid. Any

previously existing Connection object is automatically clos微信官方下载ed when the associated

Pooled开国大典Connection.getConnection method is called. Listeners (conn天风证券ection

pool managers) are not notified in this case.

This gives the application server a way to take a connection away from a client.

This is an unlikely scenario but may be useful if the application server is trying

to force an orderly shutdown.

所以之前得到的Connection有或许会失效!!

可是实践上我估量没人会按这个计划来完成,由于太不友爱,怎么能他人用着你就把它悄悄地封闭掉了。

测试了pr申请书模板oxool,当设置最大Connection数为1时,在获取第二个Connection时,会抛出个反常。

物理衔接和逻辑衔接

衔接池中分为物理衔接和逻辑衔接,对应PooledConnection类和Connection类。

PooledConnection不对用户露出,当PooledConnection调用close时才封闭物理衔接。

当Connection调用close时,并不真实封闭物理衔接,仅仅把它放入池中。

Statement

Statement也分两种logical statement和physical statement。

能够完成PreparedStatement池,当Connection调用close时泸州,Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记,宫腔镜查看,并不把PreparedStatement封闭,有或许是放入到池中。

A pool of statements is associated with a PooledConnection object.

所以说一个物理衔接都有一个Statement池。至于池的巨细,能够经过ConnectionPoolDataSource的Properties来设置。

ConnectionPoolDataSource的特点

ConnectionPoolDataSource 有以下的规范特点:

maxStatements,initialPoolS泸州,Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记,宫腔镜查看ize,minPoolSize,maxPoolSize,maxIdleTime,propertyCycle。

JDBC衔接池的架构图和PreparedStatement池的架构图: