Java JDBC连接问题
我已经在Java应用程序中创建了一个getDBConnection方法。这将返回一个连接对象,因此我没有在这个方法中关闭这个连接 现在,我定期从应用程序中的各种方法调用此方法,并在try-finally块中关闭它们。我认为这应该释放连接后使用。但是,我看到MySQL管理员的服务器连接选项卡中打开了大量连接(大约50个)Java JDBC连接问题,java,jdbc,connection,Java,Jdbc,Connection,我已经在Java应用程序中创建了一个getDBConnection方法。这将返回一个连接对象,因此我没有在这个方法中关闭这个连接 现在,我定期从应用程序中的各种方法调用此方法,并在try-finally块中关闭它们。我认为这应该释放连接后使用。但是,我看到MySQL管理员的服务器连接选项卡中打开了大量连接(大约50个) //Defining a method to retrieve a database connection // PropDemo is a properties class t
//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对象。这里可能缺少什么
出于效率和安全考虑,我计划用准备好的报表替换所有报表。这会有很大帮助吗?还可以做些什么
编辑:
这只是一个核心java应用程序,它通过MySQL JDBC连接器反复查询MySQL数据库中某些字段的更改。我没有使用任何像Spring或Hibernate这样的框架 应用程序关闭时是否也关闭连接对象?应用程序关闭时是否也关闭连接对象?您是在J2EE应用程序服务器中使用JDBC连接还是在Hibernate中使用JDBC连接? 这两种方法都倾向于从一个相当高的连接池开始,因此您会看到大量的连接池
查看有关连接池的详细信息 您是在J2EE应用服务器中使用JDBC连接,还是与Hibernate一起使用? 这两种方法都倾向于从一个相当高的连接池开始,因此您会看到大量的连接池
查看有关连接池的详细信息 您可以采用单例方法解决此问题,并且仅当当前连接对象为空时才创建新的连接对象:
If (connectionObject != null){
return connectionObject;
}else {
//create new connection object
}
这将确保您在任何时候只有一个非空连接。您可以采用单例方法解决此问题,并且仅在当前连接对象为空时创建新的连接对象:
If (connectionObject != null){
return connectionObject;
}else {
//create new connection object
}
这将确保您在任何时候只有一个非空连接。您的代码看起来正常
这就是您创建新连接的方式
可能错误就在您关闭它的地方
你应该在最后一个街区把它关上
还有一些问题
1) 你确定那50个连接来自这个程序吗?也许你的办公室里还有其他人。要确认这一点,您需要停止程序,然后再次查看连接监视器
2) 您的应用程序是否同时使用多个连接?当你同时使用50时,这可能是一个峰值
如果您可以在关闭连接的位置发布代码。问题可能就在那里
此外,我建议您使用连接池。您可以自己构建一个,也可以在此页面上查看结果:
您的代码看起来很正常
这就是您创建新连接的方式
可能错误就在您关闭它的地方
你应该在最后一个街区把它关上
还有一些问题
1) 你确定那50个连接来自这个程序吗?也许你的办公室里还有其他人。要确认这一点,您需要停止程序,然后再次查看连接监视器
2) 您的应用程序是否同时使用多个连接?当你同时使用50时,这可能是一个峰值
如果您可以在关闭连接的位置发布代码。问题可能就在那里
此外,我建议您使用连接池。您可以自己构建一个,也可以在此页面上查看结果:
需要更多信息。您的环境是什么?它是一个独立的应用程序、一个框架还是一个JavaEE容器?您是否使用连接池?需要更多信息。您的环境是什么?它是一个独立的应用程序、一个框架还是一个JavaEE容器?你使用连接池吗?是的。我已经处理好了,是的。我已经处理好了。