赞
踩
不一定最新的就是最好的,这个JAR包就是用过去的才能连接MYSQL数据库,用新的就出现classnotfound。
在引入mysql-connector-java-8.0.15.jar包创建连接时,出现错误
Rejecting re-init on previously-failed class java.lang.Class<com.mysql.cj.MysqlType>: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/sql/SQLType;
at com.mysql.cj.MysqlType com.mysql.cj.protocol.a.NativeProtocol.findMysqlType(com.mysql.cj.conf.PropertySet, int, short, long, com.mysql.cj.util.LazyString, com.mysql.cj.util.LazyString, int, java.lang.String) (NativeProtocol.java:1563)
at com.mysql.cj.result.Field com.mysql.cj.protocol.a.ColumnDefinitionReader.unpackField(com.mysql.cj.protocol.a.NativePacketPayload, java.lang.String) (ColumnDefinitionReader.java:134)
at com.mysql.cj.protocol.ColumnDefinition com.mysql.cj.protocol.a.ColumnDefinitionReader.read(com.mysql.cj.protocol.ProtocolEntityFactory) (ColumnDefinitionReader.java:77)
at com.mysql.cj.protocol.ProtocolEntity com.mysql.cj.protocol.a.ColumnDefinitionReader.read(com.mysql.cj.protocol.ProtocolEntityFactory) (ColumnDefinitionReader.java:40)
at com.mysql.cj.protocol.ProtocolEntity com.mysql.cj.protocol.a.NativeProtocol.read(java.lang.Class, com.mysql.cj.protocol.ProtocolEntityFactory) (NativeProtocol.java:1685)
at com.mysql.cj.protocol.Resultset com.mysql.cj.protocol.a.TextResultsetReader.read(int, boolean, com.mysql.cj.protocol.a.NativePacketPayload, com.mysql.cj.protocol.ColumnDefinition, com.mysql.cj.protocol.ProtocolEntityFactory) (TextResultsetReader.java:68)
at com.mysql.cj.protocol.ProtocolEntity com.mysql.cj.protocol.a.TextResultsetReader.read(int, boolean, com.mysql.cj.protocol.Message, com.mysql.cj.protocol.ColumnDefinition, com.mysql.cj.protocol.ProtocolEntityFactory) (TextResultsetReader.java:48)
at com.mysql.cj.protocol.ProtocolEntity com.mysql.cj.protocol.a.NativeProtocol.read(java.lang.Class, int, boolean, com.mysql.cj.protocol.a.NativePacketPayload, boolean, com.mysql.cj.protocol.ColumnDefinition, com.mysql.cj.protocol.ProtocolEntityFactory) (NativeProtocol.java:1698)
at com.mysql.cj.protocol.Resultset com.mysql.cj.protocol.a.NativeProtocol.readAllResults(int, boolean, com.mysql.cj.protocol.a.NativePacketPayload, boolean, com.mysql.cj.protocol.ColumnDefinition, com.mysql.cj.protocol.ProtocolEntityFactory) (NativeProtocol.java:1752)
at void com.mysql.cj.NativeSession.loadServerVariables(java.lang.Object, java.lang.String) (NativeSession.java:833)
at void com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer() (ConnectionImpl.java:1307)
at void com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(boolean) (ConnectionImpl.java:966)
I/zygote64: at void com.mysql.cj.jdbc.ConnectionImpl.createNewIO(boolean) (ConnectionImpl.java:825)
at void com.mysql.cj.jdbc.ConnectionImpl.(com.mysql.cj.conf.HostInfo) (ConnectionImpl.java:455)
at com.mysql.cj.jdbc.JdbcConnection com.mysql.cj.jdbc.ConnectionImpl.getInstance(com.mysql.cj.conf.HostInfo) (ConnectionImpl.java:240)
at java.sql.Connection com.mysql.cj.jdbc.NonRegisteringDriver.connect(java.lang.String, java.util.Properties) (NonRegisteringDriver.java:199)
at java.sql.Connection java.sql.DriverManager.getConnection(java.lang.String, java.util.Properties, java.lang.ClassLoader) (DriverManager.java:569)
at java.sql.Connection java.sql.DriverManager.getConnection(java.lang.String, java.lang.String, java.lang.String) (DriverManager.java:219)
at void com.example.testmysql.MainActivity$1.run() (MainActivity.java:28)
at void java.lang.Thread.run() (Thread.java:764)
Caused by: java.lang.ClassNotFoundException: Didn’t find class “java.sql.SQLType” on path: DexPathList[[zip file “/data/app/com.example.testmysql-E1gHTSr6dG7aQAKWmtwIKQ==/base.apk”],nativeLibraryDirectories=[/data/app/com.example.testmysql-E1gHTSr6dG7aQAKWmtwIKQ==/lib/arm64, /system/lib64, /vendor/lib64]]
at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125)
at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
at com.mysql.cj.MysqlType com.mysql.cj.protocol.a.NativeProtocol.findMysqlType(com.mysql.cj.conf.PropertySet, int, short, long, com.mysql.cj.util.LazyString, com.mysql.cj.util.LazyString, int, java.lang.String) (NativeProtocol.java:1563)
at com.mysql.cj.result.Field com.mysql.cj.protocol.a.ColumnDefinitionReader.unpackField(com.mysql.cj.protocol.a.NativePacketPayload, java.lang.String) (ColumnDefinitionReader.java:134)
at com.mysql.cj.protocol.ColumnDefinition com.mysql.cj.protocol.a.ColumnDefinitionReader.read(com.mysql.cj.protocol.ProtocolEntityFactory) (ColumnDefinitionReader.java:77)
at com.mysql.cj.protocol.ProtocolEntity com.mysql.cj.protocol.a.ColumnDefinitionReader.read(com.mysql.cj.protocol.ProtocolEntityFactory) (ColumnDefinitionReader.java:40)
at com.mysql.cj.protocol.ProtocolEntity com.mysql.cj.protocol.a.NativeProtocol.read(java.lang.Class, com.mysql.cj.protocol.ProtocolEntityFactory) (NativeProtocol.java:1685)
at com.mysql.cj.protocol.Resultset com.mysql.cj.protocol.a.TextResultsetReader.read(int, boolean, com.mysql.cj.protocol.a.NativePacketPayload, com.mysql.cj.protocol.ColumnDefinition, com.mysql.cj.protocol.ProtocolEntityFactory) (TextResultsetReader.java:68)
at com.mysql.cj.protocol.ProtocolEntity com.mysql.cj.protocol.a.TextResultsetReader.read(int, boolean, com.mysql.cj.protocol.Message, com.mysql.cj.protocol.ColumnDefinition, com.mysql.cj.protocol.ProtocolEntityFactory) (TextResultsetReader.java:48)
at com.mysql.cj.protocol.ProtocolEntity com.mysql.cj.protocol.a.NativeProtocol.read(java.lang.Class, int, boolean, com.mysql.cj.protocol.a.NativePacketPayload, boolean, com.mysql.cj.protocol.ColumnDefinition, com.mysql.cj.protocol.ProtocolEntityFactory) (NativeProtocol.java:1698)
at com.mysql.cj.protocol.Resultset com.mysql.cj.protocol.a.NativeProtocol.readAllResults(int, boolean, com.mysql.cj.protocol.a.NativePacketPayload, boolean, com.mysql.cj.protocol.ColumnDefinition, com.mysql.cj.protocol.ProtocolEntityFactory) (NativeProtocol.java:1752)
at void com.mysql.cj.NativeSession.loadServerVariables(java.lang.Object, java.lang.String) (NativeSession.java:833)
at void com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer() (ConnectionImpl.java:1307)
at void com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(boolean) (ConnectionImpl.java:966)
at void com.mysql.cj.jdbc.ConnectionImpl.createNewIO(boolean) (ConnectionImpl.java:825)
at void com.mysql.cj.jdbc.ConnectionImpl.(com.mysql.cj.conf.HostInfo) (ConnectionImpl.java:455)
at com.mysql.cj.jdbc.JdbcConnection com.mysql.cj.jdbc.ConnectionImpl.getInstance(com.mysql.cj.conf.HostInfo) (ConnectionImpl.java:240)
at java.sql.Connection com.mysql.cj.jdbc.NonRegisteringDriver.connect(java.lang.String, java.util.Properties) (NonRegisteringDriver.java:199)
at java.sql.Connection java.sql.DriverManager.getConnection(java.lang.String, java.util.Properties, java.lang.ClassLoader) (DriverManager.java:569)
at java.sql.Connection java.sql.DriverManager.getConnection(java.lang.String, java.lang.String, java.lang.String) (DriverManager.java:219)
at void com.example.testmysql.MainActivity$1.run() (MainActivity.java:28)
at void java.lang.Thread.run() (Thread.java:764)
E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: com.example.testmysql, PID: 10856
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/mysql/cj/MysqlType;
考虑一下,可能是引入的jar包的问题,后又去mysql安装目录下找到 mysql-connector-java-8.0.12.jar,在android studio 删除以前的包重新导入时,出现新的错误:Communications link failure
W/System.err: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
W/System.err: The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:832)
at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:456)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
at java.sql.DriverManager.getConnection(DriverManager.java:569)
at java.sql.DriverManager.getConnection(DriverManager.java:219)
at com.example.testmysql.MainActivity$1.run(MainActivity.java:28)
at java.lang.Thread.run(Thread.java:764)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
然后又去解决这个问题,去看了一下stackoverflow上面的答案:
(这里是网址:https://stackoverflow.com/questions/6865538/solving-a-communications-link-failure-with-jdbc-and-mysql)
我的两个程序中遇到了同样的问题。我的错误是这样的:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
我花了几天时间来解决这个问题。我已经测试了许多在不同网站中提到过的方法,但是没有这些方法有效。最后我改变了我的代码,发现了问题所在。我会试着告诉你不同的方法并总结一下。
当我在寻找互联网找到这个错误的解决方案时,我发现有很多解决方案适用于至少一个人,但是其他人说这对他们不起作用! 为什么有很多这种错误的方法? 这似乎可以发生这种错误通常当在连接到服务器时出现问题。可能问题是由于错误的查询字符串或与数据库的连接太多。
所以我建议你逐一尝试所有的解决方案,不要放弃!
以下是我在互联网上找到的解决方案,对于每个解决方案,至少有人通过该解决方案解决了他的问题。
提示:对于需要更改MySQL设置的解决方案,可以参考以下文件:
Linux:/etc/mysql/my.cnf或/etc/my.cnf(取决于所使用的Linux发行版和MySQL包)
Windows:C:** ProgramData ** \ MySQL \ MySQL Server 5.6 \ my.ini(注意它是ProgramData,而不是Program Files)
以下是解决方案:
更改“bind-address”属性
取消注释“bind-address”属性或将其更改为以下IP之一:
bind-address=“127.0.0.1”
要么
绑定地址=“0.0.0.0”
评论“跳过网络”
如果MySQL配置文件中存在“跳过网络”行,请在该行的开头添加“#”符号进行注释。
更改“wait_timeout”和“interactive_timeout”
将这些行添加到MySQL配置文件中:
wait_timeout = 数字
interactive_timeout = 数字
connect_timeout = 数字
确保Java没有将’localhost’转换为[::: 1]而不是[127.0.0.1]
由于MySQL识别127.0.0.1(IPv4)但不识别::: 1(IPv6)
使用以下两种方法之一可以避免这种情况:
选项#1:在连接字符串中使用127.0.0.1而不是localhost,以避免将localhost转换为::: 1
选项#2:使用选项-Djava.net.preferIPv4Stack = true运行java以强制java使用IPv4而不是IPv6。在Linux上,这也可以通过运行(或将其放在/ etc / profile中来实现):
export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
检查操作系统代理设置,防火墙和防病毒程序
确保防火墙或防病毒软件没有阻止MySQL服务。
暂时在linux上停止iptables。如果iptables配置错误,可能会允许将tcp数据包发送到mysql端口,但阻止tcp数据包返回同一连接。
Redhat enterprise and CentOS
systemctl stop iptables.service
Other linux distros
service iptables stop
在Windows上停止防病毒软件。
更改连接字符串
检查您的查询字符串。您的连接字符串应该是这样的事情:
dbName = “my_database”;
dbUserName = “root”;
dbPassword = “”;
String connectionString = “jdbc:mysql://localhost/” + dbName + “?user=” + dbUserName + “&password=” + dbPassword + “&useUnicode=true&characterEncoding=UTF-8”;
确保字符串中没有空格。应该继续所有连接字符串,不带任何空格字符。
尝试将“localhost”替换为环回地址127.0.0.1。还尝试在连接字符串中添加端口号,例如:
String connectionString = “jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8”;
通常MySQL的默认端口是3306。
不要忘记将用户名和密码更改为MySQL服务器的用户名和密码。
更新JDK驱动程序库文件
测试不同的JDK和JRE(如JDK 6和7)
不要更改max_allowed_packet
“ max_allowed_packet ”是MySQL配置文件中的变量,表示最大数据包大小,而不是最大数据包数。所以它无助于解决这个错误。
改变tomcat的安全性
将TOMCAT6_SECURITY = yes更改为TOMCAT6_SECURITY = no
使用validationQuery属性
使用validationQuery =“select now()”来确保每个查询都有响应
autoReconnect的
将此代码添加到您的连接字符串:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
虽然这些解决方案都不适用于我,但我建议你尝试一下。因为有些人通过以下步骤解决了他们的问题。
但是什么解决了我的问题?
我的问题是我在数据库上有很多SELECT。每次我创建一个连接然后关闭它。虽然我每次关闭连接,但系统面临许多连接并给了我这个错误。我所做的是我将连接变量定义为整个类的公共(或私有)变量,并在构造函数中初始化它。然后我每次只使用那个连接。它解决了我的问题,也大大提高了我的速度。
结论
没有简单而独特的方法来解决这个问题。我建议你考虑一下自己的情况并选择上述解决方案。如果在程序开头出现此错误并且根本无法连接到数据库,则可能是连接字符串中存在问题。但是如果在几次成功交互到数据库后出现此错误,问题可能在于连接数量,您可能会考虑更改“wait_timeout”和其他MySQL设置,或者重写代码如何减少连接数。
但这篇帖子还是没解决我的问题,在Android 端下载了一个名为“ping”的app,在上面测试时,我的手机是可以远程访问我的远程服务器的公网IP的。在纠结了三四天后,去看了一下以前java web项目连接mysql的jar包,发现以前用的是mysql-connector-java-5.1.46-bin.jar也可以连接我的mysql8.0,
所以再次更换了jar包,更改驱动名称为 Class.forName(“com.mysql.jdbc.Driver”);即删除MySQL5.6规定cj. 然后再url里设置useSSL=flase;
- @Override
- public void run() {
- try {
- Class.forName("com.mysql.cj.jdbc.Driver");
-
- Connection cn= DriverManager.getConnection("jdbc:mysql://remoteIP:3306/medicine?useSSL=true","ro
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。