1

工場で製品をロードするカー キューのリストを表示する Java アプリケーションを作成します。今回はループを使用して、(MySQL) データベースからの読み取りによって表示を毎秒更新しましたが、「接続が多すぎます」というエラーに直面しました。

これを行うのに効率的な他の方法はありますか?データベースのトリガーをゴーグルしましたが、それでもわかりませんでした。

4

3 に答える 3

3

ある種のConnection poolingを使用する必要があります。また、 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

目的を果たしたらすぐに接続を強制終了してください。これは、クラス間で結果セットを移動すると少しトリッキーになります。結果セットをクエリし、それらをいくつかの素敵な多次元配列リストまたは快適に使用できるコレクションに割り当て、そこで接続を切断してから、データを生かしておくことができる限り。そうすれば、多くの接続を扱う必要はありません

私は基本的に、最大1つの接続でアプリケーション全体を構築しました....それは非常に単純なものでしたが。乾杯!

于 2014-05-10T15:39:08.670 に答える