最近从MS SQL Server换到了MySQL,已经是8.11版本了,安装的时候似乎还用了新的身份认证方式之类的,连接过程中也是磕磕绊绊,碰到很多奇奇怪怪的问题,在此记录下来。

驱动加载:

以前使用JDBC时,都是导入相应的JDBC驱动jar包,然后使用

Class.forName(driverName);

加载驱动,再进行数据库连接,在使用MySQL 8.11版本及其对应的Connector时,如果使用上述代码加载com.mysql.jdbc.Driver的话,控制台会输出一行信息:

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.

大概意思是加载的这个类已被弃用,新驱动类是com.mysql.cj.jdbc.Driver,通过SPI自动注册,通常不需要手动加载。注释掉Class.forName后运行就不会产生该输出了。

连接数据库时的URL:

URL前半部分格式固定,需要附加的参数是通过类似网址中的QueryString附着在后面的,格式如下:

jdbc:<_database>://

:/[?_key1=_value1[&_key2=_value2[&_key3=_value3]...]]

在此仅列举用到的几个参数:

不加参数进行连接时首先会输出这样一行提示信息:

Tue May 08 20:16:40 CST 2018 WARN: Establishing SSL connection without server‘s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn‘t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false‘. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

大概意思是不建议在没有服务器身份验证的情况下建立SSL连接等等,由于本人对SSL并不了解,就直接按照提示在加上参数useSSL=false,就不会产生该输出了。

接下来遇到的错误是一个关于时区的SQLException:The server time zone value......

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.

大概意思是服务器的时区值有问题,我这直接就是一团乱码了,按照提示加上参数serverTimezone=Hongkong,就不会产生这个异常了,对于该参数的取值可以查阅相关资料获得,已知东8区可以用Hongkong、Asia/Shanghai或者Asia/Hongkong作为参数取值。

SQLNonTransientConnectionException:Public Key Retrieval is not allowed

这时可能程序已经能够正常连接数据库了,不过我在调试成功后第二天再次连接时(未对代码进行改动),抛出了一个异常并连接失败,多次尝试无果,该异常如下:

SQLNonTransientConnectionException: Public Key Retrieval is not allowed

对于这个异常网上相关资料很少,多为英文,误打误撞下竟然解决了这个问题,方法为添加一个参数allowPublicKeyRetrieval=true,即可正常连接,而且在连接成功一次后,删除此参数仍然可以正常连接(不懂得都是玄学)......,该方法来自(https://bugs.mysql.com/bug.php?id=75670)下一位dalao的评论:

[20 Aug 2015 19:57] Daniel So

Added the following entry to the Connector/J 6.0 changelog:

"If the MySQL server‘s default authentication method was SHA256 but neither one of the Connector/J connection properties allowPublicKeyRetrieval and serverRSAPublicKeyFile was set, the authentication failed with a TransientConnectionException, complaining that the public key could not be retrieved. With this fix, authentication continues in the situation, allowing other enabled authentication methods to be tried."

然而并没有看懂。

另外就是字符编码问题,本人服务器默认使用的编码为UTF-8MB4,Eclipse默认编码均使用UTF-8,所以并未处理编码问题。

若需要进行编码转换需要附加参数useUnicode=true 和 characterEncoding=UTF-8。

参数名称

参数说明

缺省值

最低版本要求

user

数据库用户名(用于连接数据库)

所有版本

password

用户密码(用于连接数据库)

所有版本

useUnicode

是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true

false

1.1g

characterEncoding

当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk

false

1.1g

autoReconnect

当数据库连接异常中断时,是否自动重新连接?

false

1.1

autoReconnectForPools

是否使用针对数据库连接池的重连策略

false

3.1.3

failOverReadOnly

自动重连成功后,连接是否设置为只读?

true

3.0.12

maxReconnects

autoReconnect设置为true时,重试连接的次数

3

1.1

initialTimeout

autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒

2

1.1

connectTimeout

和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本

0

3.0.1

socketTimeout

socket操作(读写)超时,单位:毫秒。 0表示永不超时

0

3.0.1

特别注意!在某些通过配置文件来指定URL的情况下(如xml配置文件),URL后参数的隔离符号&需要使用&转义为&,其他符号也是如此:

HTML中常用的特殊字符(Character Entities)

显示结果说明Entity NameEntity Number

显示一个空格

<

小于

<

<

>

大于

>

>

&

&符号

&

&

双引号

"

"

其他常用的字符实体(Character Entities)

显示结果说明Entity NameEntity Number

?

版权

©

©

?

注册商标

®

®

×

乘号

×

×

÷

除号

÷

÷

Java Web中遇到的坑:

No suitable driver found for jdbc:mysql://...

前面提到MySQL启用的旧驱动使用了新的通过SPI自动注册的驱动,在普通Java程序下可以正常运行,但是在Java Web项目中运行在Tomcat8.5环境下时,进行数据库连接操作会抛出异常:

java.sql.SQLException: No suitable driver found for jdbc:mysql://...

大概的意思是找不到合适的JDBC驱动程序,经过检查,已经将使用到的驱动jar包放到了Tomcat的lib目录下,Eclipse中的构建路径也包含了该jar包,在执行连接操作前向控制台打印所用驱动类也存在:

System.out.println(com.mysql.cj.jdbc.Driver.class);

/*

*输出:

**

*class com.mysql.cj.jdbc.Driver

*

*/

今天出现编码出现了No suitable driver found for jdbc,又是找遍了网上的资料,基本上都说是三个问题:

一是:连接URL格式出现了问题(Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/XX","root","XXXX")

二是:驱动字符串出错(com.mysql.jdbc.Driver)

三是Classpath中没有加入合适的mysql_jdbc驱动

经过我的仔细检查,这三种错误我都没有犯,为什么呢?

尝试着将mysql-connector-java-3.1.14-bin.jar的jar包加入C:\Program Files\Java\jre1.6.0_02\lib\ext文件夹下,问题解决了!!

原来是不仅仅要求将驱动加入classpath中,而且需要将该jar包加入到java运行环境的外部jar包中,唉,下次这种低级错误还是少犯为妙。

对于这三个说法,本人针对前两条进行了检查,并没有错误,第三条个人认为不正确,Tomcat会自动加载lib下的jar包,况且上面在打印驱动类的Class对象时也确实能看到该类已经被加载,对于下面将驱动jar包放入系统jre下的方(玄)法(学)也并未尝试,不过,在连接数据库操作前加了主动加载驱动类的代码后竟然神(玄)奇(学)的好了:

System.out.println(com.mysql.cj.jdbc.Driver.class);

Class.forName(driverName);

System.out.println("connecting...");

conn = DriverManager.getConnection(URL, uName, uPwd);

System.out.println("connect success!");

/*

*输出:

**

*class com.mysql.cj.jdbc.Driver

*connecting...

*connect success!

*

*/

可以看到在手动加载之前该类已经注册,因此这个玄学问题还希望请知道的dalao指教一二!

目前遇到的问题就这些,日后遇到新的问题继续补充,文中理解的若有错误还请dalao们指正,欢迎大家的讨论交流。

jdbc mysql 5.05_JDBC 连接 MySQL 时碰到的小坑相关推荐

  1. MySQL授予远程连接权限时出现:ERROR 1819 (HY000): Unknown error 1819

    MySQL授予远程连接权限时出现:ERROR 1819 (HY000): Unknown error 1819 不知道啥情况,可能是我的点太背了, 电脑老想跟我作对,授予接远程连接都不成了 网上找了找 ...

  2. 使用php连接mysql数据库_PHP使用mysql与mysqli连接Mysql数据库用法示例

    本文实例讲述了PHP使用mysql与mysqli连接Mysql数据库的方法.分享给大家供大家参考,具体如下: 代码很简单直接上了 /** * @Author: HTL * @Description: ...

  3. c语言 连接 mysql,C语言连接mysql -select

    C语言实现查询mysql数据库的行数,列的属性,以及每条记录. /* select.c */ #include #include #include #include "/usr/includ ...

  4. django本地安装mysql_Ununtu 15.04 安装MySql(Django连接Mysql)

    本文介绍Ubuntu 15.04下安装MySQL ubuntu 15.04安装mysql django项目连接mysql 一.安装数据库 1.sudo apt-get install mysql-se ...

  5. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)--创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)--使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  6. mycat连接mysql时间_Mycat连接MySQL 8时的注意事项

    一.问题 MyCat是一个基于MySQl协议的开源的分布式中间件,其核心是分库分表. 但是目前MyCat仍主要面对MySQL 5.5, 5.6, 5.7版,对最新的MySQL 8尚未完全支持,需要用户 ...

  7. 【MySQL 数据库】JDBC 编程之 Java 连接 MySQL

    文章目录 1. 数据库编程的基础条件 2. Java 的数据库编程:JDBC 3. JDBC 访问数据库的层次结构 4. MySQL 数据库操作介绍 5. MySQL 驱动包的下载及添加到项目 6. ...

  8. 测试jdbc连mysql数据库_java连接mysql数据库及测试是否连接成功的方法

    本文实例讲述了java连接mysql数据库及测试是否连接成功的方法.分享给大家供大家参考,具体如下: package com.test.tool; import java.sql.Connection ...

  9. php链接mysql 老是die_php连接MySQL时, 为什么die(错误信息: . $conn-connect_error) 不返回错误信息?...

    php连接MySQL时,遇到个问题搞不懂了.代码(如下图):<?php $servername="localhost";$username="root"; ...

最新文章

  1. RISC-V与DSA计算机架构
  2. 澳洲服务器拳头账号怎么注册,lol手游东南亚服拳头账号注册教程 东南亚服怎么注册拳头账号[多图]...
  3. linux复制文件命令cat ,Linux学习之四(复制移动文件命令cp等及查看文本命令cat等)2017-03-28...
  4. [VMM 2008虚拟化之初体验-2] 界面功能介绍
  5. OpenCASCADE:拓扑 API之缝纫
  6. java安全编码指南之:拒绝Denial of Service
  7. tcp协议seq和ack
  8. python编程(fabric部署)
  9. c语言中变量可以用x1表示没,你必须知道的495个C语言问题 读书笔记
  10. Seldom2.0: 如何更简单的实现HTTP接口测试
  11. linux文件的基本权限、默认权限、特殊权限总结
  12. NumPy库---一元函数
  13. 计算机中丢失jadec.dll,技能干货丨超实用,Jade各种安装问题完美解决方案!
  14. 【项目源码】JavaWeb网上购书系统
  15. 呼叫中心点击拨打接口升级代码
  16. 数据挖掘之数据处理——SVM神经网络的数据分类预测-意大利葡萄酒种类识别
  17. 华为鸿蒙系统平板电脑,华为5G鸿蒙系统平板电脑正式入网,搭载八核处理器麒麟9000芯片...
  18. 近期做笔试题总结和思考(百度,滴滴,360)
  19. 【Qtree】Query on a tree系列LCT解法
  20. uniapp使用ucharts图表及问题汇总

热门文章

  1. C++:乱码之字符串编码
  2. 斩获新一轮数亿元融资,Seesaw这杯创意咖啡里有多少“泡沫”?
  3. 六、模块实现:用户管理模块(1)
  4. 鼠标键盘与计算机无法连接,蓝牙鼠标/键盘同时提示已配对 但是永远无法连接上...
  5. 使用Vue导出word(纯前端,异步处理图片)
  6. 使用Telnet 命令行发信
  7. 读书笔记(II) 编译原理及实践
  8. 搭建一个多对多的音视频通信服务
  9. python pyecharts生成图表
  10. 网络中搜不到局域网内的其他计算机,局域网中搜不到其他计算机怎么修复