web-dev-qa-db-ja.com

アプリケーション全体で1つのデータベース接続オブジェクトを使用するにはどうすればよいですか?

接続オブジェクトを返すこのクラスを作成しました。 MySQLデータベースを使用しました。

public class Connect_db {        
    public Connection getConnection(String db_name,String user_name,String password)
    {
        Connection con=null;
        try
        {
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return con;        
    }
}  

今私がしたいのは、このクラスを一度インスタンス化して接続オブジェクトを取得することだけです。そして、この同じオブジェクトをアプリケーション全体で使用したいと思います。別の解決策も認められるであろう。

10
Dhruv Kapatel

シングルトンパターンが必要だと思います。簡単な例を次に示します。

public class Connect_db {        
    static Connection con=null;
    public static Connection getConnection()
    {
        if (con != null) return con;
        // get db, user, pass from settings file
        return getConnection(db, user, pass);
    }

    private static Connection getConnection(String db_name,String user_name,String password)
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return con;        
    }
} 

その後、次のような接続を使用できます。

Connect_db.getConnection().somemethods();

しかし、あなたは考えるべきです-マルチスレッド環境でこれがどのように機能するか、いくつかのスレッドがデータベースにリクエストを作ろうとしているとき。

10
Iłya Bursov

非常に原始的な方法で、Connectionインスタンスを取得できます。

Connect_db.getConnection(dbName、userName、passwd);

静的メソッドであるため、どのクラスでも。

public class Connect_db {   
static {
     try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        throw new IllegalArgumentException("MySQL db driver isnot on classpath");
    }
}
public static Connection getConnection(String db_name,String user_name,String password) throws SQLException
{
    return DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);    
}

}

アプリケーションがマルチスレッドであり、プールを適切に使用する必要がある場合

1
JosefN

私はLashaneの応答が本当に好きだったので、コードを使用してDataSourceソリューションを作成しました。また、複数を開く場合に備えて、DataSourceではなくConnectionのみを格納するように再設計しました。

_import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class SignalDB {

    private static MysqlDataSource ds = null;

    public static MysqlDataSource getDataSource(String db_name) {
        if (ds == null) {
            // db variables set here
            getDataSource(db_url, db_user, db_password, db_port);
        }
        ds.setDatabaseName(db_name);
        return ds;
    }

    private static void getDataSource(String db_url, String db_user, String db_password, int db_port) {
        try {
            ds = new MysqlDataSource();
            ds.setServerName(db_url);
            ds.setUser(db_user);
            ds.setPassword(db_password);
            ds.setPort(db_port);
        } catch (Exception e) {
            System.out.println("MysqlDataSource err: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
_

次に、以下を使用して接続を作成できます。

con = SignalDB.getDataSource("database_name").getConnection();

毎回異なるデータベースに接続する機能を追加しました。場合によっては、私たちのデータベースのように、その場で実行する必要があります。

お役に立てれば。

1
Dmitry Buslaev