1

我在我的 Java 应用程序中创建了一个 getDBConnection 方法。这将返回一个连接对象,因此我没有在此方法本身中关闭此连接。

现在,我定期从应用程序中的各种方法调用此方法,并在 try - finally 块中关闭它们。我认为这应该在使用后释放连接。但是,我看到在 MySQL 管理员的服务器连接选项卡中打开了大量连接(大约 50 个)。

//Defining a method to retrieve a database connection
// PropDemo is a properties class that retrieves Database related values from a file
public Connection getDBConnection() {

    //Instantiating the Properties object
    PropDemo prop = new PropDemo();
    Connection con = null;

    // Retrieving values from the parameters.properties file
    String JdbcDriver = prop.getMessage("JdbcDriver");
    String JdbcUrlPrefix = prop.getMessage("JdbcUrlPrefix");
    String DBIP = prop.getMessage("DBIP");
    String DBName = prop.getMessage("DBName");
    String DBUser = prop.getMessage("DBUser");
    String DBPassword = prop.getMessage("DBPassword");

    try {

        // Loading and instantiating the JDBC MySQL connector driver class
        Class.forName(JdbcDriver).newInstance();
        con = DriverManager.getConnection(JdbcUrlPrefix + DBIP + "/" + DBName, DBUser, DBPassword);


          if (con.isClosed())
                    Logger.log("Connection cannot be established", "vm");

    } catch (Exception e) {
        Logger.log("Exception: " + e, "vm");
        Logger.log(Logger.stack2string(e), "vm");
    }
    return con;

}

我还将关闭相关的 ResultSet 和 Statement 对象。这里可能缺少什么?

出于效率和安全原因,我计划用 PreparedStatements 替换所有 Statements。这会有很大帮助吗?还有什么可以做的?

编辑:这只是一个核心 java 应用程序,它通过 MySQL-JDBC 连接器反复查询 MySQL 数据库中某些字段的更改。我没有使用 Spring 或 Hibernate 等任何框架。

4

4 回答 4

1

你的代码看起来很正常。

这就是您创建新连接的方式。

错误可能是您关闭它的位置。

您应该在 finally 块中关闭它。

一些额外的问题。

1) 你确定这 50 个连接来自这个程序吗?也许还有其他人来自您的同一个办公室。要确认这一点,您需要停止该程序,并再次查看您的连接监视器。

2)您的应用程序是否同时使用多个连接?当您同时使用 50 个时,它可能是一个高峰。

如果您可以在关闭连接的位置发布代码。问题可能就在那里。

另外,我建议您使用连接池。您可以自己构建一个,也可以从此页面查看结果:

Java中有多少个JDBC连接?

于 2009-01-28T18:54:04.980 回答
0

当您的应用程序关闭时,您是否也在关闭连接对象?

于 2009-01-28T00:51:23.090 回答
0

您是在 J2EE 应用程序服务器中还是在 Hibernate 中使用 JDBC 连接?这两者都倾向于从一个相当高的连接池开始,所以你会看到一个很大的数字。

查看有关连接池的详细信息。

于 2009-01-28T01:08:51.417 回答
0

您可以对问题采取单例方法,并且仅在当前对象为空时才创建新的 Connection 对象:

If (connectionObject != null){
   return connectionObject;
}else {
   //create new connection object
}

这将确保您在任何时候都只有一个非空连接。

于 2009-01-28T14:39:54.290 回答