维护 SQLITE 连接而不打开它们 1000 次。 *没有使用后打开和关闭*
Mentain SQLITE Connection without open them for 1000 times. *WITHOUT OPEN AND CLOSE AFTER USING*
我在 Java 中为我的 Minecraft 服务器创建了一个数据库。我使用 Java 8,但我想知道如何维护服务器期间打开的 SQLITE 连接是 运行。
当我启动服务器时,连接被打开,当我关闭时,连接被关闭。
问题是,我的代码使用的是 PreparedStatements,它在我需要创建语句时随时访问连接。
我的代码是:https://hastebin.com/ahinidikev.java
我怎样才能只使用 1 个连接并仅从这个连接使用准备语句,而不是其他连接?
拜托,一个代码示例,对我来说更容易理解。
我收到错误消息:SQLITE 数据库已关闭,已重现,因为我同时使用了 2 个异步连接,所以我需要维护连接
只存储连接对象,不要关闭它...这没什么特别的。
在您的代码中,您正在使用 try-with-resources,这会导致连接关闭,因为 try 声明中的所有可关闭项都在 try-with-resources 块的末尾关闭。
try (Connection connection = connectToSQLite(); // here, you are doing that inside try(), so it will be closed at the end of try block.
PreparedStatement preparedStatement =
connection.prepareStatement("SELECT * from `dates` WHERE `uuid` =?")) {
preparedStatement.setString(1, uuid);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
consumer.accept(resultSet.next());
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
因此,如果您将在 onEnable 中连接一次,然后将该连接对象存储在某个变量中,您可以在需要的地方使用它:
//field in class
private Connection connection;
//inside onEnable
connection = connectToSQLite();
//in other method:
try (PreparedStatement preparedStatement =
connection.prepareStatement("SELECT * from `dates` WHERE `uuid` =?")) {
preparedStatement.setString(1, uuid);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
consumer.accept(resultSet.next());
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
但请注意,连接可能因许多其他原因而失败,您可能需要重新连接,使用一些池可能是个好主意,有一些库可以做到这一点,例如 HikariCP,然后您仍然 "close" 您的连接,您可以(并且应该)仍然使用 try-with-resources 但是来自库的连接而不是关闭自身只会 return 到连接池。
它还允许您以非常简单的方式在多个线程中使用此连接。
我在 Java 中为我的 Minecraft 服务器创建了一个数据库。我使用 Java 8,但我想知道如何维护服务器期间打开的 SQLITE 连接是 运行。
当我启动服务器时,连接被打开,当我关闭时,连接被关闭。
问题是,我的代码使用的是 PreparedStatements,它在我需要创建语句时随时访问连接。
我的代码是:https://hastebin.com/ahinidikev.java
我怎样才能只使用 1 个连接并仅从这个连接使用准备语句,而不是其他连接?
拜托,一个代码示例,对我来说更容易理解。
我收到错误消息:SQLITE 数据库已关闭,已重现,因为我同时使用了 2 个异步连接,所以我需要维护连接
只存储连接对象,不要关闭它...这没什么特别的。
在您的代码中,您正在使用 try-with-resources,这会导致连接关闭,因为 try 声明中的所有可关闭项都在 try-with-resources 块的末尾关闭。
try (Connection connection = connectToSQLite(); // here, you are doing that inside try(), so it will be closed at the end of try block.
PreparedStatement preparedStatement =
connection.prepareStatement("SELECT * from `dates` WHERE `uuid` =?")) {
preparedStatement.setString(1, uuid);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
consumer.accept(resultSet.next());
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
因此,如果您将在 onEnable 中连接一次,然后将该连接对象存储在某个变量中,您可以在需要的地方使用它:
//field in class
private Connection connection;
//inside onEnable
connection = connectToSQLite();
//in other method:
try (PreparedStatement preparedStatement =
connection.prepareStatement("SELECT * from `dates` WHERE `uuid` =?")) {
preparedStatement.setString(1, uuid);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
consumer.accept(resultSet.next());
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
但请注意,连接可能因许多其他原因而失败,您可能需要重新连接,使用一些池可能是个好主意,有一些库可以做到这一点,例如 HikariCP,然后您仍然 "close" 您的连接,您可以(并且应该)仍然使用 try-with-resources 但是来自库的连接而不是关闭自身只会 return 到连接池。
它还允许您以非常简单的方式在多个线程中使用此连接。