- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个基本的 Java 应用程序来将一些文件加载到 mysql 数据库中。我能够毫无问题地加载文件并填充我的表。然而,在与审查我的代码的人交谈后,我显然没有正确关闭我的连接并浪费资源。我在哪里不关闭连接?我做错了吗?
我在我的 DbSinger 类中使用 try-with-resources 构造来对我的数据库执行准备好的语句,只要实现了 AutoCloseable 接口(interface),它就会自动关闭连接,它是在 Db 的父类中。然而,close() 方法从未达到。 DbSinger 在我的 main() 中实例化,然后使用 populateSingers() 的单一方法运行 Singer> 对象。
连接类
public class SQLConnection {
private static final String servername = "localhost";
private static final int port = 3306;
private static final String user = "ng_user";
private static final String pass = "ng";
private static final String db = "ng_music";
private static final String connectionString = "jdbc:mysql://" + servername + ":" + port + "/" + db;
public Connection provide() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(connectionString, user, pass);
}
catch (SQLException | ClassNotFoundException e) {
throw new SQLConnectionException(e);
}
}
public class SQLConnectionException extends RuntimeException {
SQLConnectionException(Exception e) {super(e);}
}
}
抽象父类
public abstract class Db implements AutoCloseable{
private Connection connection;
Db() {
SQLConnection sqlC = new SQLConnection();
this.connection = sqlC.provide();
}
@Override
public synchronized void close() throws SQLException {
if(connection != null) {
connection.close();
connection = null;
System.out.println("Connection closed");
}
}
Connection getConnection() {
return connection;
}
boolean checkIfPopulated(String query){
try {
PreparedStatement ps = getConnection().prepareStatement(query);
ResultSet rs = ps.executeQuery();
return !rs.next();
} catch (SQLException e) {
e.printStackTrace();
}
return true;
}
}
执行歌 watch 数据库查询的具体类
public class DbSinger extends Db {
public DbSinger() {
super();
}
public void populateSingers(ArrayList<Singer> singers) {
String populateSingersQuery = "insert into ng_singers(name, dob, sex) values(?,?,?)";
if(!checkIfPopulated("select * from ng_singers")){
System.out.println("Singer Table is already populated");
return;
}
try (PreparedStatement ps = getConnection().prepareStatement(populateSingersQuery)) {
for (Singer s : singers) {
ps.setString(1, s.getName());
ps.setDate(2, java.sql.Date.valueOf(s.getDob()));
ps.setString(3, s.getSex());
ps.addBatch();
}
ps.executeBatch();
System.out.println("Singers added to table");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
我的代码能够执行并能够正常运行并执行所需的操作,但我想了解我不关闭连接的原因和位置,并了解如何解决此问题。或者至少了解我是否处理错误。
最佳答案
在您的情况下,您需要在 try-with-resources
语句中实例化 DBSinger 类以关闭底层连接。
而不是做:
DbSinger dbSinger = new DbSinger();
你需要做的:
try (DbSinger dbSinger = new DbSinger()) {
// Your other code
}
这样,您在 Db
类中覆盖的 close()
方法将被自动调用。
此外,通过以下方式关闭您在 checkIfPopulated
方法中创建的 preparedStatement
:
try (PreparedStatement ps = getConnection().prepareStatement(query)) {
// Other codes
}
关于java - SQL 连接悬空 : Where am I not correctly closing up connections correctly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56600634/
我遵循了 V. Romeo 关于实体管理的教程(在 GitHub 和 Youtube 上)。 然后我尝试重写类 CEntity、CComponent 和测试 CPosition(主要来自 Romeo
为什么下面的代码中有悬空引用?我认为对 const 的引用总是将临时对象的生命周期延长到它们的范围。 boost::filesystem::recursive_directory_iterator i
我有一个多线程应用程序,将传入消息发布到 rabbitmq 交换。使用 rabbitmq java 客户端,我在应用程序启动时创建了一个 rabbitmq 连接,并在我的所有线程中共享它。每个线程都会
我有一个 Git 存储库,其中有大量提交不在特定分支下,我可以 git show 它们,但是当我尝试列出包含它们的分支时,它没有返回任何内容。 我认为这是悬空提交/树问题(由于 -D 分支),所以我修
我是 Linux 的新手,并且继承了保持我们的单一 Linux 服务器运行的职责。这是我们的SVN服务器,所以比较重要。 原来在我之前维护它的人有一个 cron 任务,当有太多 svnserve 进程
我是一名优秀的程序员,十分优秀!