- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将迷你游戏的玩家统计数据存储在 SQL 数据库中,但在加载统计数据时遇到以下错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
[23:37:09] [Server thread/WARN]: at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[23:37:09] [Server thread/WARN]: at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
[23:37:09] [Server thread/WARN]: at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
[23:37:09] [Server thread/WARN]: at java.lang.reflect.Constructor.newInstance(Unknown Source)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.Util.getInstance(Util.java:408)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1187)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1182)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4035)
[23:37:09] [Server thread/WARN]: at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4004)
代码:
public void loadPlayer(Player p) {
if (!isPlayerInDataBase(p)) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), new Runnable() {
@Override
public void run() {
try (Connection connection = sqlConnection.c) {
PreparedStatement insert = connection.prepareStatement(
"INSERT INTO `MurderData` (uuid, wins, deaths, loses, kills, score) VALUES (?, ?, ?, ?, ?, ?)");
insert.setString(1, p.getUniqueId().toString());
insert.setInt(2, 0);
insert.setInt(3, 0);
insert.setInt(4, 0);
insert.setInt(5, 0);
insert.setInt(6, 0);
insert.execute();
ClosePreparedStatement(insert);
} catch (SQLException e) {
e.printStackTrace();
}
}
});
}
if (isPlayerInDataBase(p)) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), new Runnable() {
@Override
public void run() {
try (Connection connection = sqlConnection.c;
PreparedStatement select = connection.prepareStatement(
"SELECT * FROM `MurderData` WHERE uuid='" + p.getUniqueId().toString() + "'")) {
ResultSet result = select.executeQuery();
if (result.next()) {
if (getPlayerData(p) != null) {
getPlayerData(p).adddeaths(result.getInt("deaths"));
getPlayerData(p).addkill(result.getInt("kills"));
getPlayerData(p).addwins(result.getInt("wins"));
getPlayerData(p).addlose(result.getInt("loses"));
getPlayerData(p).addscore(result.getInt("score"));
}
CloseResultSet(result);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
});
}
}
这段代码的错误:
PreparedStatement select = connection.prepareStatement(
"SELECT * FROM `MurderData` WHERE uuid='" + p.getUniqueId().toString() + "'")) {
完整代码:
public boolean isPlayerInDataBase(Player p) {
try (Connection connection = sqlConnection.c;
PreparedStatement select = connection.prepareStatement(
"SELECT * FROM `MurderData` WHERE uuid='" + p.getUniqueId().toString() + "'")) {
ResultSet result = select.executeQuery();
if (result.next()) {
result.close();
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
附带问题:完成该过程后我应该关闭结果集和准备好的语句吗?我应该立即执行还是延迟执行?
最佳答案
看来您已经采取了try-with-resources来自其他代码的语句而不了解它的作用。从该链接:
The try-with-resources statement is a try statement that declares one or more resources. A resource is an object that must be closed after the program is finished with it. The try-with-resources statement ensures that each resource is closed at the end of the statement. Any object that implements java.lang.AutoCloseable, which includes all objects which implement java.io.Closeable, can be used as a resource.
换句话说,当你使用语法时
try (Connection connection = sqlConnection.c) {
// ...
}
您正在隐式调用 close()
在 sqlConnection.c
上,不再分配给它。因此,下次您尝试从此连接查询数据库时,它仍然处于关闭状态,因此您会收到此错误。
一个简单的修复方法是将局部变量 connection
的声明移出 try-with-resources 语句,这样它就不会在方法结束时关闭。您还应该查看程序中其他位置使用 try-with-resources 语法的位置,并确保没有关闭任何您不想关闭的内容。
这是您的代码的固定版本(来自您在评论中链接的 pastebin):
public boolean isPlayerInDataBase(Player p) {
Connection connection = sql.getConnection();
try (PreparedStatement select = connection.prepareStatement(
"SELECT * FROM `MurderData` WHERE uuid='" + p.getUniqueId().toString() + "'")) {
ResultSet result = select.executeQuery();
if (result.next()) {
CloseResultSet(result);
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
此外,在您的 loadPlayer()
方法中,您可以将两个 if
语句替换为:
if (isPlayerInDataBase(p)) {
// code if player is in database
} else {
// code if player is not in database
}
关于java - 获取玩家统计数据时出现 MySQLNonTransientConnectionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45360696/
有Grails2.2/Hibernate/Tomcat7/MySQL5.5 web服务器。在几个小时内没有 Web 客户端请求它之后,对它的第一个请求失败如下。 (事实上 ,它每天早上都会发生。)
我在 PDI (Kettle) 中遇到 MySQL 问题。该错误出现在通过输入表读取信息的过程中。即使所有数据都成功地从基数中给出,也会出现此错误,并且可能不会影响转换。 Error comittin
尝试使用在 NetBeans 上运行的 GlassFish 服务器连接到 MySQL 时总会出现此异常。 (com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransi
我使用 PreparedStatement 进行选择时遇到异常。 Got an exception accessing TestCase data! null Problem to connect.
我将迷你游戏的玩家统计数据存储在 SQL 数据库中,但在加载统计数据时遇到以下错误: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnecti
我的 Spring-MVC 应用程序在浏览站点时有时会崩溃,我从日志中得到的错误消息如下所示。我完全不知道是什么原因造成的,并且非常感谢任何能引导我走向正确方向的提示。 SEVERE: Ser
使用 MySQL 8.0 版、mysql-connector-java 5.1.48 版、Spring Core 4.3.4 和 Spring Boot 1.4.2 版。 连接字符串是 jdbc:my
当我部署我的应用程序时,过了一会儿我得到了这个异常: javax.servlet.ServletException: Exception [EclipseLink-4002] (Eclipse
我们在虚拟服务器上有一个原始的 Debian 7。带有 OpenJDK 1.7.0_65 的 Tomcat7 连接到本地 MySQL 5.5 安装。具有 ColdFusion 核心(Razuna,MA
我有一个 Java 中的 JDBC MySQL 连接。我的程序可以很好地执行简单的查询。 如果我运行同一个程序超过 10 个小时并执行查询,那么我会收到以下 MySQL 异常: com.mysql.j
我正在运行一个使用 Hibernate 和 C3P0 作为连接池、MySQL 5.6 数据库的 Java Web 应用程序。我继续在已部署的应用程序中遇到连接超时和生成错误的问题: Caused by
我正在处理使用 JDBC 连接到 Amazon RDS 上的 MySQL 数据库的奇怪问题。我有两部不同的 Android 手机在同一网络上运行相同的代码。一个连接没有任何问题。另一个给了我以下异常:
所以我进行了一堆异步调用,唯一的问题是,在我的准备方法中生成一个PreparedStatement,它获取连接(或者如果连接错误则使用新的连接),并且由于某种原因仍然抛出此错误. 我最初认为(现在仍然
我遇到了这个异常 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed
我正在尝试将我的 Spring Boot 应用程序与 MySQL 服务器连接。 我已正确遵循文档,但仍然遇到一些相关问题每次都会抛出以下异常 com.mysql.jdbc.exceptions.jdb
每当我在 Hudson 中构建作业时,在尝试将结果存储到数据库中时总是会在最后失败。整个工作通常需要大约一个小时的时间来构建和失败。 源文件存储在SVN服务器上,可在本地下载和编辑。一旦我验证作业能够
获取以下代码的错误 package jdbcdrive; import java.sql.*; public class Lpt { /** * @param args
我覆盖了 tomcat 中的一个 war 文件,但没有删除以前的 war 文件。我去了日志,同样的错误在一个循环中,描述如下: MySQLNonTransientConnectionException
我正在处理一个使用 JDBC 连接到 Amazon RDS 上的 MySQL 数据库的奇怪问题。我在同一网络上有两部不同的 Android 手机运行相同的代码。一个连接没有任何问题。另一个给我以下异常
我有一个使用 Hibernate 和 MySQL 的 Java webapp。如果网站几天不使用,MySQL 连接就会失效,我会遇到以下异常: com.mysql.jdbc.exceptions.jd
我是一名优秀的程序员,十分优秀!