mysql 6.x 驱动使用 mysql-connector-java 6.x

一. 升级mysql-connector-java.6.0.6:

 

MySQL 的6.x 驱动发布已经有一段时间了,准备从原先的5.1.39更新到6.0.6。

更新 jar

然后启动项目,

 

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
[WARNING] Unable to create initial connections of pool.
Java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:569)
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:537)
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:527)
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:512)
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:480)
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:498)
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:494)

 

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

新的驱动类,位置有了变化,修改配置:

driver_class=com.mysql.jdbc.Driver

改为:

driver_class=com.mysql.cj.jdbc.Driver


java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

这句话说明必须知道时区:

修改URL配置

jdbc_url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC

我完整的URL配置

jdbc:mysql:///test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false

重新启动项目测试,成功启动并且正常增删改查

 

二. java连接MySql数据库zeroDateTimeBehavior:

 

二. java连接MySql数据库 zeroDateTimeBehavior:

 

JAVA连接MySQL数据库,在操作值为0timestamp类型时不能正确的处理,而是默认抛出一个异常,就是所见的:java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 7 to TIMESTAMP。这一问题在官方文档中有详细说明,详见如下链接:

http://bugs.mysql.com/bug.php?id=19274

http://dev.mysql.com/doc/refman/5.5/en/connector-j-installing-upgrading.html

 

JDBC连接串中有一项属性:zeroDateTimeBehavior,可以用来配置出现这种情况时的处理策略,该属性有下列三个属性值:

exception:默认值,即抛出SQL state [S1009]. Cannot convert value....的异常;

convertToNull:将日期转换成NULL值;

round:替换成最近的日期即0001-01-01

 

因此对于这类异常,可以考虑通过修改连接串,附加zeroDateTimeBehavior=convertToNull属性的方式予以规避,例如:

jdbc:mysql://localhost:3306/mydbname?zeroDateTimeBehavior=convertToNull

 

   从另一个层面讲,这类异常的触发也与timestamp赋值的操作有关,如果能够在设计阶段和记录写入阶段做好逻辑判断,避免写入 '0000-00-00 00:00:00'这类值,那么也可以避免出现 Cannot convert value '0000-00-00 00:00:00' from column N to TIMESTAMP的错 误。

 

 

MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。

 

只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)。不过,驱动具体是怎么样批量执行的? 你是不是需要看一下内幕,才敢放心地使用这个选项? 下文会给出答案。

 

另外,有人说rewriteBatchedStatements只对INSERT有效,有人说它对UPDATE/DELETE也有效。为此我做了一些实验(详见下文),结论是: 这个选项对INSERT/UPDATE/DELETE都有效,只不过对INSERT它为会预先重排一下SQL语句

 

注:本文使用的mysql驱动版本是5.1.12

猜你喜欢

转载自wb8206656.iteye.com/blog/2391439