JDBC连接问题

时间:2009-01-28 00:36:26

标签: java jdbc connection

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

现在,我定期从我的应用程序中的各种方法调用此方法,并在try-finally块中关闭它们。我认为这应该在使用后释放连接。但是,我看到MySQL Administrator的Server Connections选项卡中打开了大量连接(大约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 Objects。这里可能缺少什么?

出于效率和安全原因,我计划用PreparedStatements替换所有语句。这有助于显着吗?还有什么可以做的?

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

4 个答案:

答案 0 :(得分:1)

你的代码看起来很清醒。

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

可能错误就是关闭它的地方。

你应该在finally块中关闭它。

其他一些问题。

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

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

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

此外,我建议您使用连接池。你可以自己构建一个,或者你可以从这个页面看到结果:

How many JDBC connections in Java?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您是在J2EE应用服务器中使用JDBC连接还是在Hibernate中使用JDBC连接? 这两种情况往往都是从一个相当高的连接池开始,所以你会看到很多。

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

答案 3 :(得分:0)

您可以采用Singleton方法解决问题,只有当前的Connection对象为null时才会创建一个新的Connection对象:

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

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