1

我正在使用 Java 应用程序前端连接 MySQL 5.6 服务器上的数据库并与之交互。使用 MySQL 中的 JDBC 连接器时,当调用 con.close() 时,与服务器建立的连接没有关闭。但是,当应用程序关闭时,连接都将被删除。以下是用于进行查询的 dao 类。

package binaparts.dao;

import java.sql.*;

import org.json.JSONArray;
import org.json.JSONObject;

import binaparts.properties.*;
import binaparts.util.ToJSON;

public class DBConnect {

protected Statement st = null;
protected ResultSet rs = null;
protected Connection con = null;    
protected PreparedStatement pst = null;
private String configFilePath = "config.properties";
public DBConnect(){
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }
}
private Connection getDBConnection() throws Exception{

    ConfigurationManager configProps = new ConfigurationManager(configFilePath);
    String host = configProps.getProperty("host");
    String port = configProps.getProperty("port");
    String database = configProps.getProperty("database");
    String user = configProps.getProperty("user");
    String password = configProps.getProperty("password");

    try{
        con = DriverManager.getConnection("jdbc:mysql" + "://" + host + ":" + port + "/" + database, user, password);
    }catch(SQLException SQLex){
        con = null;
    }catch(Exception ex){
        ex.printStackTrace();
        con = null;
    }finally{
        try{rs.close();} catch(Exception ex) { /*ignore*/}
        try{st.close();} catch(Exception ex) { /*ignore*/}
        try{pst.close();} catch(Exception ex) { /*ignore*/}
    }
return con;
}

下一段代码是一种使用数据库验证应用程序用户的方法。有一些 System.out.println() 语句可以在整个过程中跟踪 con 变量。

public boolean verifyUser() throws Exception {

    ConfigurationManager config = new ConfigurationManager(configFilePath);
    String username = config.getProperty("appUser");
    String password = config.getProperty("appPassword");
    boolean userCheck = false;
    try{
        if(con == null){
        System.out.println("there is not a connection");
        }
        if(con != null){
            System.out.println("there is a connection");
        }
        con = getDBConnection();
        if(con == null){
            System.out.println("get connection did not work");
        }
        if(con != null){
            System.out.println("get connection did work");
        }
        JSONObject temp = queryReturnUser(username).getJSONObject(0);
        con.close();
        String un = null;
        try{
            un = temp.get("username").toString();
        }catch(Exception ex){un = " ";}

        String pw = null;
        try{
            pw = temp.get("password").toString();
        }catch(Exception ex){pw = " ";}

        if(username.equals(un)){
            if(password.equals(pw)){
                userCheck = true;
            }
        }
    }catch(Exception ex){/*ignore*/}
    finally{
        try{
            if(con == null){
                System.out.println("connection was terminated before finally");
            }
            if(con != null){
                System.out.println("connection was not terminated before finally");
                System.out.println("trying again...");
                con.close();
            }
            if(con != null){
                System.out.println("there is a connection still");
            }
        }catch(Exception ex){ex.printStackTrace();}
    }
return userCheck;
}

运行该方法的输出是:

没有连接

获得连接确实有效

在 finally 之前没有终止连接

再试一次……

仍然有联系

如果我改变 con.close(); 到 con = null; 然后我得到输出:

没有连接

获得连接确实有效

连接在 finally 之前终止

所以连接在那时成功终止,但我觉得这不是正确的方法。

4

4 回答 4

2

我认为你想要con.isClosed()而不是con==null为了你的支票。仅仅因为您关闭了 aConnection并不意味着您对对象本身的引用将是null.

于 2013-10-09T14:31:24.487 回答
2

在对象上调用close()方法Connection并不意味着该Connection对象将null在方法执行结束时close()

如果您想测试您的连接是否已成功关闭,那么您应该调用该isClosed()方法。

于 2013-10-09T14:31:50.213 回答
2

con关闭连接与对象为空无关。您的程序可能正在运行,并且您的连接已关闭。如果你强制它,你的对象con只会是空的

...
if(con != null){
    System.out.println("connection was not terminated before finally");
    System.out.println("trying again...");
    con.close();
    con = null;
}
....
于 2013-10-09T14:27:19.440 回答
1

您的getDBConnection()方法正在返回一个关闭的连接。因此,您将永远无法使用该连接。不确定在getDBConnection()方法中关闭连接的逻辑是什么。

您应该有不同的方法来关闭连接。

于 2013-10-09T14:26:47.867 回答