MySQL文档阅读笔记之2015-03-31

1,068 views

今天的主题是Java版本的MySQL数据库驱动。这个话题比较纠结,原因是我之前从来不认为数据库驱动文档有什么可研究的,但在最近一段时间粗略看过MySQL驱动的文档后,得出几个结论:

      作为开源软件,MySQL的文档确实相当丰富;
      MySQL JDBC驱动的文档很长,其中提供了相当多的选项,虽然部分选项的说明不全;
      MySQL和Oracle差异比较大,在使用MySQL作开发时不能想当然,需要详细的观察和测试;
      MySQL JDBC驱动虽然为每个选项都提供了默认值,但仍然期望使用者根据场景自行选择最佳值,对于选择困难症患者来说,MySQL JDBC驱动遗留了一个巨大的难题。
      MySQL JDBC驱动的文档值得一看,从中可以了解到设计、实现一款数据库驱动需要面对的需求和问题。

总结一下这几天实践的收获。
首先,MySQL JDBC初始化时,JDBC的URL属性和Oracle差异比较大,标准格式的说明如下

jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]

比较特别的是可以在URL中增加一些特别属性字段,MySQL JDBC驱动可以通过解析URL来获取到这些定制的参数和值,比如样例:

jdbc:mysql://localhost:3306/wechat?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=round

但是在URL里面写属性并不方便,当增加的属性越来越多,JDBC URL就很难理解了。下午研究了下Spring的配置文件,发现可以在Spring的Bean配置文件中为MySQL的驱动传入配置属性,详细配置如下。

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${jdbc.driver}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<property name="connectionProperties">
<props>
<prop key="useUnicode">true</prop>
<prop key="characterEncoding">UTF-8</prop>
<prop key="zeroDateTimeBehavior">round</prop>
<prop key="useCompression">true</prop>
</props>
</property>

</bean>

简单的说,在数据源对象的配置中增加红色的部分,设置数据库链接属性。根据我本地的验证,使用这样的方法,可以设置比如logger属性,但其它属性是否全部生效,还需要花点时间观察下。

上周五加班时在网上搜索MySQL和PreparedStatement相关的资料,看到一篇网友写的文章,对MySQL实现的PreparedStatement特性有个评价,大意是世界上两种PreparedStatement,其中MySQL的PreparedStatement是一种,而其它的PreparedStatement是一种。当然只是觉得好笑,但没找到更加官方的说明。刚才在MySQL JDBC的资料里找到如下的文字,真相终于出现了。

PreparedStatement
PreparedStatements are implemented by the driver, as MySQL does not have a prepared statement feature. Because of this, the driver does not implement getParameterMetaData() or getMetaData() as it would require the driver to have a complete SQL parser in the client.

看来MySQL对PreparedStatement的支持确实有限,依据网友的经验,上述配置信息中还应当增加如下几个属性。

<prop key="cachePrepStmts">true</prop>
<prop key="useServerPrepStmts">true</prop>
<prop key="prepStmtCacheSize">25</prop>
<prop key="prepStmtCacheSqlLimit">255</prop>

根据MySQL JDBC文档,可以使用useConfigs来指定默认的一些参数组合,比如当应用期望高性能时,可以增加参数useConfigs=maxPerformance
根据文档,上述配置相当于如下的几个参数的组合。

cachePrepStmts=true
cacheCallableStmts=true
cacheServerConfiguration=true
useLocalSessionState=true
elideSetAutoCommits=true
alwaysSendSetIsolation=false
enableQueryTimeouts=false

不过这几个参数具体有什么作用,需要再观察观察了。

关于autoReconnect,MySQL JDBC驱动的资料里有如下的描述,简单的说就是没必要开启这个特性,使用这个特性反而会有意外的负作用。

Should the driver try to re-establish stale and/or dead connections? If enabled the driver will throw an exception for a queries issued on a stale or dead connection, which belong to the current transaction, but will attempt reconnect before the next query issued on the connection in a new transaction. The use of this feature is not recommended, because it has side effects related to session state and data consistency when applications don’t handle SQLExceptions properly, and is only designed to be used when you are unable to configure your application to handle SQLExceptions resulting from dead and stale connections properly. Alternatively, as a last option, investigate setting the MySQL server variable “wait_timeout” to a high value, rather than the default of 8 hours.
Default: false

MySQL的文档还算不错,针对每个选项都有专门的小节来说明作用,格式也比较规范,应该来说还是很用心的。但对于我等初学者来说,除了要阅读文档,更重要的是期望通过实践掌握观察选项、评估选项作用的方法,这样才能更好的在日常工作中利用MySQL,少吃点亏。时候不早了,今天先写到这里。



若非注明,均为原创,欢迎转载,转载请注明来源:MySQL文档阅读笔记之2015-03-31

关于 JackieAtHome

基层程序员,八年之后重新启航

此条目发表在 MySQL, 笔记 分类目录。将固定链接加入收藏夹。