2009-01-28 178 views
1

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

现在,我定期从我的应用程序中的各种方法调用此方法,并在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这样的框架。

+0

你可以发布您的代码? – Mark 2009-01-28 01:00:16

+0

需要更多信息。你的环境是什么,它是一个独立的应用程序框架,一个JavaEE容器?你使用连接池吗? – OscarRyz 2009-01-28 01:22:07

回答

1

您的代码看起来很健全。

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

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

你应该在finally块中关闭它。

还有一些问题。

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

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

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

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

How many JDBC connections in Java?

0

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

0

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

查看连接池的详细信息。

0

你可以采取一个Singleton解决问题的方法,并仅在当前一个是空创建一个新的连接对象:

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

这将确保你只需要在任何时候一个非空连接。