我在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这样的任何框架。
答案 0 :(得分:1)
你的代码看起来很清醒。
这就是你创建新连接的方式。
可能错误就是关闭它的地方。
你应该在finally块中关闭它。
其他一些问题。
1)你确定这50个连接来自这个程序吗?也许还有一些人来自同一个办公室。要确认这一点,您需要停止程序,然后再次查看连接监视器。
2)您的应用程序是否同时使用多个连接?当你同时使用50时,它可能是一个高峰。
如果您可以在关闭连接的位置发布代码。可能存在问题。
此外,我建议您使用连接池。你可以自己构建一个,或者你可以从这个页面看到结果:
答案 1 :(得分:0)
您是否在应用程序关闭时关闭连接对象?
答案 2 :(得分:0)
您是在J2EE应用服务器中使用JDBC连接还是在Hibernate中使用JDBC连接? 这两种情况往往都是从一个相当高的连接池开始,所以你会看到很多。
查看有关连接池的详细信息。
答案 3 :(得分:0)
您可以采用Singleton方法解决问题,只有当前的Connection对象为null时才会创建一个新的Connection对象:
If (connectionObject != null){
return connectionObject;
}else {
//create new connection object
}
这将确保您在任何时候只有一个非空连接。