【问题标题】:JDBC Connection IssueJDBC 连接问题
【发布时间】:2010-10-03 21:55:26
【问题描述】:

我在我的 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。这会有很大帮助吗?还能做什么?

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

【问题讨论】:

  • 需要更多信息。你的环境是什么,它是一个独立的应用程序、一个框架还是一个 JavaEE 容器?你使用连接池吗?

标签: java jdbc connection


【解决方案1】:

您的代码看起来很正常。

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

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

你应该在 finally 块中关闭它。

一些额外的问题。

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

2) 您的应用程序是否同时使用多个连接?当您同时使用 50 个时,可能会达到峰值。

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

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

How many JDBC connections in Java?

【讨论】:

    【解决方案2】:

    您可以采用单例方法解决该问题,并且仅在当前连接对象为空时创建一个新的连接对象:

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

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

    【讨论】:

      【解决方案3】:

      您是在 J2EE 应用程序服务器中使用 JDBC 连接还是与 Hibernate 一起使用? 这两种方法一开始都会有一个相当高的连接池,所以你会看到一个很大的数字。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 是的。我已经处理好了。
        猜你喜欢
        • 2023-03-27
        • 2012-12-24
        • 2011-04-01
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        相关资源
        最近更新 更多