我制作的Java应用程序将显示将在工厂加载产品的汽车队列列表。这次我使用循环来每秒读取(MySQL)数据库来更新显示,我遇到了“连接太多”的错误。
有没有其他方法可以做到这一点。我盯着数据库的触发器,但我仍然不理解它。
答案 0 :(得分:3)
您需要使用某种Connection pooling。另外,正确close在finally块中打开的所有连接。
答案 1 :(得分:3)
使用静态连接对象或使用连接池。
http://www.mchange.com/projects/c3p0/
或
http://commons.apache.org/proper/commons-dbcp/
这是一个使用c3p0 api
的简单示例package com.chetan.dbconnection;
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class ConnectionProvider {
private static String SERVER = "localhost";
private static String PORT = "3306";
private static String DATABASE = "yourdb";
private static String UID = "root";
private static String PWD = "password";
private static Connection conn;
private static DataSource ds;
public static Connection getConnection() {
try {
if (ds == null) {
ds = setupDataSource();
}
if (conn == null || conn.isClosed()) {
conn = ds.getConnection();
}
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
private static DataSource setupDataSource() {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
String server = prop.getProperty("SERVER", SERVER);
String port = prop.getProperty("PORT", PORT);
String db = prop.getProperty("DATABASE", DATABASE);
String uid = prop.getProperty("UID", UID);
String pwd = prop.getProperty("PWD", PWD);
log.info("Getting new database connection");
String driver = "com.mysql.jdbc.Driver";
String dbUrl = "jdbc:mysql://" + server + ":" + port + "/" + db
+ "?autoReconnect=true";
try {
cpds.setDriverClass(driver);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
cpds.setJdbcUrl(dbUrl);
cpds.setUser(uid);
cpds.setPassword(pwd);
cpds.setMinPoolSize(1);
cpds.setInitialPoolSize(1);
cpds.setAcquireIncrement(1);
cpds.setMaxPoolSize(20);
//cpds.setUnreturnedConnectionTimeout(100);
} catch (IOException e1) {
e1.printStackTrace();
}
return cpds;
}
}
答案 2 :(得分:0)
确保一旦达到目的,就立即杀死连接。通过在我们的类周围移动结果集,这会变得非常棘手,您可能希望获得一个类,其中您查询结果集,将它们分配给一些不错的多维arraylist或任何集合,您觉得使用起来很舒服并且终止那里的连接然后传递你周围的数据可以让它保持活力。那种方式你没有处理很多连接
我基本上只在最多一个连接上构建了一个完整的应用程序....虽然它非常简单。干杯!