1

我制作了 Java 应用程序,它将显示将在工厂加载产品的汽车队列列表。这次我使用循环通过每秒读取(MySQL)数据库来更新显示,我遇到了“连接太多”的错误。

有没有其他有效的方法来做到这一点。我盯着数据库的触发器,但我还是不明白。

4

3 回答 3

3

您需要使用某种连接池。另外,请正确关闭您在finally块中打开的所有连接。

于 2013-07-04T09:29:05.797 回答
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;

}
}
于 2013-07-04T09:29:27.017 回答
0

确保您在连接达到目的后立即终止连接。这在我们的类周围移动结果集有点棘手,您可能希望获得一个类,您可以在其中查询结果集,将它们分配给一些不错的多维数组列表或任何您觉得使用起来很舒服的集合,然后在那里终止连接并传递数据尽可能地保持活力。这样你就不用处理很多连接了

我基本上只在最多一个连接上构建了一个完整的应用程序......虽然它是一个非常简单的连接。干杯!

于 2014-05-10T15:39:08.670 回答