我无法连接到在自己的计算机上运行的MySQL实例,但是我对这种情况的了解还不足以诊断问题。
public void readDataBase() throws Exception {
Connection connection = null;
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/tmlschedule";
try {
connection = DriverManager.getConnection(url, "user", "pass");
} catch (Exception e) {
throw e;
} finally {
close();
}
}
对.getConnection()
的调用将引发以下堆栈跟踪:
线程“主”中的异常 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 无法建立与数据库服务器的连接。在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在com.mysql.jdbc.Util.handleNewInstance(Util.java:411)处 com.mysql.jdbc.Util.getInstance(Util.java:386)在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2570) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2306) 在com.mysql.jdbc.ConnectionImpl。(ConnectionImpl.java:839)处 com.mysql.jdbc.JDBC4Connection。(JDBC4Connection.java:49)在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在com.mysql.jdbc.Util.handleNewInstance(Util.java:411)处 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:421)在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:350) 在java.sql.DriverManager.getConnection(DriverManager.java:664)在 java.sql.DriverManager.getConnection(DriverManager.java:247)在 tmlSchedule.MySQLAccess.readDataBase(MySQLAccess.java:22)在 tmlSchedule.TmlSchedule.main(TmlSchedule.java:9)由以下原因引起: java.lang.NullPointerException在 com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding(ConnectionImpl.java:3281) 在com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1940) 在 com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1866) 在com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1252)处 com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2488) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2521) ...另外14个
到目前为止我所做的:
mysql -u user -p
)并运行select&insert命令。mysql
添加为受信任的服务,用于Firewalld。sudo systemctl stop firewalld
)。这没什么区别。sudo netstat -tuplen
包含以下条目:
tcp6 0 0 :::3306 :::* LISTEN 27 113879 7224/mysqld
任何帮助将不胜感激。
编辑:
试图弄清楚MySQL和驱动程序的版本时,我感到非常困惑。
$ zipgrep 'Bundle-Version' /usr/share/java/mysql-connector-java.jar
返回:
META-INF / MANIFEST.MF:捆绑版:5.1.25`
$ mysql --version
返回:
x86_64上适用于Linux的mysql Ver 8.0.12(MySQL社区服务器-GPL)
这表明驱动程序已过期,但是我通过列出的here的yum存储库安装了MySQL,我想它将为我提供匹配数据库的驱动程序。我还尝试通过列出的here的rpm包安装Connector / J 8.0,但我收到以下消息,这对我来说没有意义:
package mysql-connector-java-1:5.1.25-3.el7.noarch(更新 比已经安装的mysql-connector-java-8.0.12-1.el7.noarch)
答案 0 :(得分:2)
由于多种原因,应用程序可能无法连接到数据库。其中之一未使用正确的驱动程序软件(又名JDBC驱动程序)。
在这种情况下,验证与数据库服务器本身兼容的jdbc驱动程序版本的使用可以解决此问题。
一个人可以从here获得正确的驱动程序软件。
一个人可以从命令提示符下验证MySQL服务器版本:首先,启动一个MySQL客户端,然后在其中使用命令mysql> select version();
答案 1 :(得分:1)
我看不到所提供的代码到底发生了什么,但是,当您构建数据访问对象时,您可能需要考虑以这样的方式构建它:Connection是类的变量,而不是类的方法。
此外,默认情况下,通常情况下,mysql数据库会期望建立安全连接。要删除此默认设置,请查看url变量。
public class DataAccessExample {
private Connection connection;
private final String driverClass = "com.mysql.jdbc.Driver";
private final String url = "jdbc:mysql://localhost:3306/tmlschedule?autoReconnect=true&useSSL=false";
private final String userName = "YOUR USERNAME";
private final String password = "YOUR PASSWORD";
//Consider calling this openConnection();
public void readDataBase() throws ClassNotFoundException, SQLException {
Class.forName(driverClass);
connection = DriverManager.getConnection(url, userName, password);
}
//Then have a close connection, this will make your life easier in the future
public void closeConnection() throws SQLException {
if (connection != null) {
connection.close();
}
}
}
要使用此代码:
public static void main(String[] args) {
DataAccessExample d = new DataAccessExample();
try {
d.readDataBase();
d.closeConnection();
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(DataAccessExample.class.getName()).log(Level.SEVERE, null, ex);
}
}
最后,请确保您的数据库名称拼写正确,并且您的用户名和密码正确。
我希望这会有所帮助。
答案 2 :(得分:1)
如果您的mysql版本是8.x,则驱动程序版本太旧,驱动程序类com.mysql.jdbc.Driver
已过时。新的驱动程序类是com.mysql.cj.jdbc.Driver
。通过SPI自动注册驱动程序,通常不需要手动加载驱动程序类。
以下代码来自official documentation:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
Connection conn = null;
...
try {
conn =
DriverManager.getConnection("jdbc:mysql://localhost/test?" +
"user=minty&password=greatsqldb");
// Do something with the Connection
...
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}