JAVA:MySql:连接太多
Posted
技术标签:
【中文标题】JAVA:MySql:连接太多【英文标题】:JAVA: MySql: too many connection 【发布时间】:2012-07-19 15:20:50 【问题描述】:我认为我的应用程序被诅咒了,调试去了它想要的地方,我不知道为什么。 逐行调试似乎也分析了注释行。 我认为问题出在我的 Connection 方法上,我发现性能显着下降,并且在第三个(或第四个 nvm)连接时出现此错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections
我确定每次访问数据库时都会关闭连接(在实现中的 try catch 中使用 finally 语句)。
这是我的连接类:
package Connection;
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.rmi.RemoteException; import java.sql.*; import java.util.Properties;
public class ConnectionDB
public static ResultSet rs = null;
public static Statement stat = null;
public static Connection cn = null;
public static void connect() throws RemoteException
String dbHost="",dbUser="",dbPassword="";
Properties prop=new Properties();
try
//carico il file:
prop.load(new FileInputStream("***/config.properties"));
//Leggo le proprietà del file:
dbHost=prop.getProperty("host");
dbUser=prop.getProperty("user");
dbPassword=prop.getProperty("password");
catch(FileNotFoundException fe)
System.out.println("config file not found");
catch(IOException ex)
System.out.println("Error reading config file");
try
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);
dbHost = "jdbc:mysql://"+dbHost;
cn = DriverManager.getConnection(dbHost,dbUser,dbPassword);
stat = cn.createStatement();
catch(SQLException e)
System.out.println("Can't connect to the DB");
catch(ClassNotFoundException cln)
System.out.println("Error using JDBC driver");
public static void disconnect() throws RemoteException
try
if(rs != null) rs.close();
if(stat != null) stat.close();
if(cn != null) cn.close();
catch(SQLException sqlEx)
System.out.println("Error: disconnect");
【问题讨论】:
***.com/questions/1392304/… 如果您在 Workbench 中签入,实际打开了多少个连接?小于允许的最大值?你认为关闭的所有连接是否也真的关闭了? 在断开连接之前你调用了多少次connect?还有一件事..每件事都是静态的..如果你这样做 connect() connect() disconnect() 你将如何断开第一个连接? @fvu: 我怎么能看到(使用 netbeans 作为 IDE)?基本上在第一次连接时就会减速,我不知道为什么...... @thinksteep 我认为最好修改我自己的“my.cnf”文件以允许更多连接,但我认为这不是解决方案,这只是一个临时修复......(但我是新手,所以所有建议都对我很有帮助^_^) 【参考方案1】:disconnect 方法可能需要以下增强。在这一个中,我们分别关闭 ResultSet、Statement 和 Connection。这将避免个别异常不会导致不关闭连接对象的情况。
public static void disconnect() throws RemoteException
try
if(rs != null) rs.close();
catch(SQLException sqlEx)
System.out.println("Error: disconnect");
try
if(stat != null) stat.close();
catch(SQLException sqlEx)
System.out.println("Error: disconnect");
try
if(cn != null) cn.close();
catch(SQLException sqlEx)
System.out.println("Error: disconnect");
【讨论】:
【参考方案2】:通常用户可用的连接数量有限。此外,建立连接是一项昂贵的操作。因此,如果您遇到性能问题,您应该开始使用连接池,discussion about connection pools
关于您的代码,请确保您始终在 finally 块中释放连接。此外,我们不知道您运行什么样的查询。打印您的查询并尝试在 mysql 中手动运行它们,看看问题是否出在您的 SQL 上,而不是 Java 上。此外,您永远不会关闭 FileInputStream,这意味着您可能会用完文件处理程序。
如果您在循环中运行相同的语句,请考虑使用 PreparedStatements 以及批量更新和事务。如果您使用事务,请确保您没有太多处于未提交状态的数据。
如果您想分析查询的性能,可以使用JAMon (Java Application Monitor)
增加连接数的建议类似于建议腹泻患者多吃食物。
【讨论】:
【参考方案3】:我认为您可以尝试以下几个选项:
如提供的cmets,您可以increase the max number of connections allowed。
您谈到了性能下降。如果这与打开的连接数有关,我建议您考虑重用您的连接。在这种情况下,使用连接池可能会有所帮助。 This might be of help 在这种情况下。
【讨论】:
【参考方案4】:如果您使用的是开发人员版本的数据库,它可能对可以建立的连接数有限制。所以你需要更好地管理它们,这意味着你应该确保它们在完成后关闭。 (编辑:刚刚意识到您使用的是 mysql,所以这应该不是问题)
另外,您提到您的调试器正在通过 cmets - 这通常是您的代码与您的构建不同步的情况。清理你的构建(在 Eclipse 中它会是 Project > clean ... > clean all projects),这个问题应该会消失。
【讨论】:
我已尝试清理所有项目,但同步问题仍然存在 :(【参考方案5】:试试这个
if(cn == null)
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);
dbHost = "jdbc:mysql://"+dbHost;
cn = DriverManager.getConnection(dbHost,dbUser,dbPassword);
【讨论】:
以上是关于JAVA:MySql:连接太多的主要内容,如果未能解决你的问题,请参考以下文章