首页 > 解决方案 > 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;
        }
    }
}

我不知道为什么会发生这种情况,或者如果我首先应该这样做,我从互联网上的教程中获得了这个类模型,它确实有效,但是有这个连接没有以某种方式关闭的问题. 我究竟做错了什么?

标签: androidpostgresqljdbcconnection

解决方案


我通过在第一个“Try”的末尾添加“finally”来解决它,所以这应该可以完美地工作:

我在 stackoverflow 上的一个 11 岁线程中找到了答案!

非常感谢tine2k!

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 用于实际的严肃内容。


推荐阅读