2013-12-18 13 views
6

接続オブジェクトを返すこのクラスを作成しました。私はMySQLデータベースを使用しています。アプリケーション全体で1つのデータベース接続オブジェクトを使用するにはどうすればよいですか?

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;   
    } 
} 

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

Connect_db.getConnection().somemethods(); 

が、 - どのようにこの意志:あなたはこのような接続を使用することができるようになります

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;   
    } 
} 

:私はあなたがシングルトンパターンを必要とし

+4

を使用することを検討してください。connection pools.http://stackoverflow.com/questions/2835090/jdbc-connection-pooling – kosa

+1

依存性注入。オブジェクトを一度インスタンス化し、オブジェクトを必要とするすべてのメソッドに渡します。 – JRizz

答えて

7

は、ここに簡単な例であります複数のスレッドがデータベースへのリクエストを作成しようとしているマルチスレッド環境で動作します。

+0

@JosefNデータベースにシングルトンを使用できるいくつかのシングルスレッドアプリケーションを想像することができます。たとえば、dbを操作して別のクラスの接続に簡単にアクセスできる必要があります。 –

+0

大変申し訳ありません。私のコメントをきれいにする。どうも – JosefN

1

非常に原始的な方法、あなたは

Connect_db.getConnection(DBNAME、ユーザ名、passwdファイル)によってConnectionインスタンスを取得することができます。

は静的メソッドなので、どのクラスでも使用できます。

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);  
} 

}

あなたapplicaitonがmutlithreadedされ、私は本当にLashaneの応答を気に入っプール

1

を使用するだけでなくperfom必要がある場合、私はDataSourceソリューションを作成するためのコードを使用していました。複数のものを開けたい場合に備えて、Connectionではなく、DataSourceのみを保存するようにデザインを変更しました。

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();

私は別のデータベースにすべての時間を接続する機能を追加し、いくつかのケースでは、私たちのような、それはあなたが上で行うために必要なものです飛ぶ。

これが役に立ちます。

関連する問題