android - Android JDBC不关闭连接,postgresql告诉我它有太多连接(检查后是真的)
问题描述
这是我的 Database.java。它确实对我想要的东西“完美无缺”,但问题是它只是没有用“connection.close()”关闭连接。
package com.example.testDB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
public class Database{
private Connection connection;
private final String host = "host";
private final String database = "databasename"
private final int port = 1234;
private final String user = "user";
private final String pass = "password";
private String url = "jdbc:postgresql://%s:%d/%s";
private boolean status;
public Database() {
this.url = String.format(this.url, this.host, this.port, this.database);
}
public void insert() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Statement stmt;
String sql = "INSERT INTO TEST_TABLE (COLUMN1, COLUMN2, COLUMN3) VALUES ('TEST','TEST','TEST')";
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection(url, user, pass);
status = true;
System.out.println("connected:" + status);
stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
connection.close();
} catch (Exception e) {
status = false;
System.out.print(e.getMessage());
e.printStackTrace();
}
}
});
thread.start();
try {
thread.join();
} catch (Exception e) {
e.printStackTrace();
this.status = false;
}
}
}
我不知道为什么会发生这种情况,或者如果我首先应该这样做,我从互联网上的教程中获得了这个类模型,它确实有效,但是有这个连接没有以某种方式关闭的问题. 我究竟做错了什么?
解决方案
我通过在第一个“Try”的末尾添加“finally”来解决它,所以这应该可以完美地工作:
我在 stackoverflow 上的一个 11 岁线程中找到了答案!
package com.example.testDB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
public class Database{
private Connection connection;
private final String host = "host";
private final String database = "databasename"
private final int port = 1234;
private final String user = "user";
private final String pass = "password";
private String url = "jdbc:postgresql://%s:%d/%s";
private boolean status;
public Database() {
this.url = String.format(this.url, this.host, this.port, this.database);
}
public void insert() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Statement stmt;
String sql = "INSERT INTO TEST_TABLE (COLUMN1, COLUMN2, COLUMN3) VALUES ('TEST','TEST','TEST')";
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection(url, user, pass);
status = true;
System.out.println("connected:" + status);
stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
} catch (Exception e) {
status = false;
System.out.print(e.getMessage());
e.printStackTrace();
} finally {
try {
connection.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
});
thread.start();
try {
thread.join();
} catch (Exception e) {
e.printStackTrace();
this.status = false;
}
}
}
执行查询后不要关闭连接,它只是不起作用。在完成所有操作后,您必须在 finally 中执行此操作。
我已经尝试修复此问题 3 天了,但由于 JDBC 不太受赞赏,因此您不会找到此类问题的实际答案,所以我希望任何像我这样有小项目的人“做不太关心”你的数据库的安全性,只是想访问它来做一些事情,这就是你应该在 Android 中做的事情。
但请记住,最好的方法仍然是使用 Web 服务器,不要将 JDBC 用于实际的严肃内容。
推荐阅读
- c++ - IDE (CLion) 无法解析 C++ 模板类型
- c# - 使用一个查询时,EFCore LINQ to SQL 查询速度很慢
- c# - 单击更新按钮或应用程序重新启动时运行 T4 文本模板
- javascript - 如何检查 youtube 直播是否处于活动状态(通过 YT-id)?
- azure - Azure 与 AWS 虚拟机存储成本
- c# - 使用 Microsoft Web 管理 C# 在单个服务级别设置 Windows 身份验证
- excel - Excel - 基于包含范围字符串的单元格绘制图表(间接?)
- python-3.x - 使用 where 子句从数据库中获取特定数据,从用户提供值以使用 python 打印与他相关的数据
- entity-framework - 在 EF Code First 中生成外键的问题 - 无法确定关联的主体端
- trace32 - 过滤每个 CPU 的跟踪输出