JDK1.7下测试ConnectorJ连接MySQL8.0的方法
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 本文来源:社区原创投稿;作者:王庆勋。 客户的一些应
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。本文来源:社区原创投稿;作者:王庆勋。<p>客户的一些应用系统使用的JDK1.7版本,在将数据库迁移到MySQL8.0的过程中,发现有些MySQL connector/J的版本无法连接到MySQL8.0。本文描述了在Linux JDK1.7环境下,测试不同版本Connector/J的方法,也可用于为MySQL接口的国产数据库产品选择Connector/J版本。</p>
MySQL Connector/J说明
MySQL通过MySQL Connector/J为用Java语言开发的客户端应用程序提供连接,MySQL Connector/J是一个实现Java数据库连接(JDBC) API的驱动程序。
MySQL Connector/J是一个JDBC 4型驱动程序。Type 4标志意味着驱动程序是MySQL协议的纯Java实现,不依赖于MySQL客户端库。
MySQL Connector/J有两个版本:
Connector/J 5.1是第4类纯Java JDBC驱动程序,符合JDBC 3.0、4.0、4.1和4.2规范。它提供了与MySQL所有功能的兼容性,包括5.6、5.7和8.0。Connector/J 5.1提供了易于开发的特性,包括向驱动程序管理器自动注册、标准化的有效性检查、分类的SQLExceptions、对大量更新计数的支持、对java.time包的本地和偏移日期时间变量的支持、对JDBC-4.x XML处理的支持、对每个连接客户端信息的支持以及对NCHAR、NVARCHAR和NCLOB数据类型的支持。Connector/J 8.0是用于Java 8平台的第4类纯Java JDBC 4.2驱动程序。它提供了兼容MySQL 5.6、5.7和8.0的所有功能。强烈推荐MySQL连接器/J 8.0与MySQL服务器8.0、5.7和5.6一起使用。请升级到MySQL连接器/J 8.0。
Connector/J不同版本的JDBC、MySQL Server和Java的信息:
可知,要支持JRE1.7版本,需选用连接器Connector/J的版本为5.1 ,而5.1的最新版本为5.1.49 。
测试Connector/J 5.1的不同版本
安装配置jdk1.7
检查当前jdk版本
[root@host73 ~]# java -version java version "1.8.0_111" Java(TM) SE Runtime Environment (build 1.8.0_111-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) [root@host73 ~]# javac -version javac 1.8.0_111
安装jdk1.7
yum install -y java-1.7.0-openjdk.x86_64 java-1.7.0-openjdk-devel.x86_64
修改JAVA_HOME
修改/etc/profile文件:
export JAVA_HOME=/usr/lib/jdk1.8.0_111
改为:
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64
重新登录,检查java版本
[root@host73 ~]# which java /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/bin/java [root@host73 ~]# which javac /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/bin/javac
[root@host74 java]# java -version java version "1.7.0_261" OpenJDK Runtime Environment (rhel-2.6.22.2.el7_8-x86_64 u261-b02) OpenJDK 64-Bit Server VM (build 24.261-b02, mixed mode) [root@host74 java]# javac -version javac 1.7.0_261
构造测试数据
确认MySQL数据库版本
mysqld --version /usr/local/mysql-8.0.26-linux-glibc2.17-x86_64-minimal-rebuild/bin/mysqld Ver 8.0.26 for Linux on x86_64 (MySQL Community Server - GPL)
创建表及用户**
create database testdb; create user testuser identified with mysql_native_password by 'testpass'; grant all on testdb.* to testuser;
use testdb;
CREATE TABLE dbinfo
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
char(20) NOT NULL DEFAULT '' COMMENT 'dbinfo',
website
varchar(255) NOT NULL DEFAULT 'website',
opensource
varchar(2) NOT NULL DEFAULT '0' COMMENT 'is opensource',
country
char(10) NOT NULL DEFAULT '' COMMENT 'country',
PRIMARY KEY (id
)
) ENGINE=InnoDB ;
insert into dbinfo values('1','Oracle','www.oracle.com','否','美国'); insert into dbinfo values('2','MySQL','www.mysql.com','是','美国'); insert into dbinfo values('3','GreatSQL','www.greatsql.com','是','中国');
编写测试用java程序
编写ShowDbinfo.java程序,用于测试连接MySQL数据库。
import java.sql.*;
public class ShowDbinfo {
// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://172.17.128.73:16315/testdb?useSSL=false";
// MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
//static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
//static final String DB_URL = "jdbc:mysql://172.17.128.73:16310/testdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
// 数据库的用户名与密码,需要根据自己的设置
static final String USER = "testuser";
static final String PASS = "testpass";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开链接
System.out.println("开始连接数据库...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// 执行查询
stmt = conn.createStatement();
String sql;
sql = "SELECT id, name, website,opensource,country FROM dbinfo";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
int id = rs.getInt("id");
String name = rs.getString("name");
String website = rs.getString("website");
String opensource = rs.getString("opensource");
String country = rs.getString("country");
// 输出数据
System.out.print("ID: " + id);
System.out.print(", 名称: " + name);
System.out.print(", website: " + website);
System.out.print(", 开源: " + opensource);
System.out.print(", 来自: " + country);
System.out.print("\n");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
se.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}
运行java程序测试
编译运行java程序,测试指定版本的连接器是否可以连接数据库。以版本5.1.46为例说明。
获取Connector/J
从MySQL官方https://downloads.mysql.com/archives/c-j/下载5.1.46版本的Connector/J,上传解压后,将mysql-connector-java-5.1.46.jar拷贝到ShowDbinfo.java所在目录。
编译运行测试程序
编译java源程序:
javac -cp .:mysql-connector-java-5.1.46.jar ShowDbinfo.java
运行java程序连接数据库:
java -cp .:mysql-connector-java-5.1.46.jar ShowDbinfo
输出结果如下:
开始连接数据库...ID: 1, 名称: Oracle, website: www.oracle.com, 开源: 否, 来自: 美国ID: 2, 名称: MySQL, website: www.mysql.com, 开源: 是, 来自: 美国ID: 3, 名称: GreatSQL, website: www.greatsql.com, 开源: 是, 来自: 中国Goodbye!
连接失败connector/J
下载测试了5.1的几个版本,结果如下表:
5.1.40无法连接MySQL8.0,报错信息如下:
开始连接数据库...java.sql.SQLException: Unknown system variable 'query_cache_size'at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3970)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2503)at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1369)at com.mysql.jdbc.ConnectionImpl.loadServerVariables(ConnectionImpl.java:3833)at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3283)at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2297)at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083)at com.mysql.jdbc.ConnectionImpl.
(ConnectionImpl.java:806)at com.mysql.jdbc.JDBC4Connection. (JDBC4Connection.java:47)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:527)at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)at java.sql.DriverManager.getConnection(DriverManager.java:571)at java.sql.DriverManager.getConnection(DriverManager.java:215)at ShowDbinfo.main(ShowDbinfo.java:27)Goodbye!
Enjoy GreatSQL