2012-01-12 8 views
0

私が持っているクラスは、さらにJDBC操作のためのConnectionオブジェクトを返します。このメソッドの結果 "return"でグローバル接続フィールドを作成する可能性はありますか?私はこのフィールドを私が必要としている場所で使用したいと思っています。あなたがこれを行うことができます静的グローバルオブジェクト

public class Connection 
{ 
    public static Connection makeConnection() throws IOException, SQLException 
    { 
     try 
     { 
      Class.forName("org.postgresql.Driver"); 

      Properties props = new Properties(); 
      FileInputStream in = new FileInputStream("dataBase.properties"); 
      props.load(in); 
      in.close(); 

      String drivers = props.getProperty("jdbc.drivers"); 
      if(drivers != null) System.setProperty("jdbc.drivers", drivers); 
      String url = props.getProperty("jdbc.url"); 
      String username = props.getProperty("jdbc.username"); 
      String password = props.getProperty("jdbc.password"); 

      return DriverManager.getConnection(url, username,password); 
     } 
     catch (ClassNotFoundException e) 
     { 
     return null; 
    } 
     catch(IOException e) 
     { 
      return null; 
     } 
     catch(SQLException e) 
     { 
      return null; 
     }  
    } 
} 
+0

あなたは 'class Foo {static Connection conn = bar();のようになります。静的な接続バー(){...}} '? –

+0

あなたがグローバルであなたのクラスに静的を意味するならば、はい。私はこれが本当に悪い設計だと指摘しなければならないが、JDBC Connectionオブジェクトはこのように使用するようには構築されていない。 – Perception

答えて

0

class Foo { 

    public static Connection conn = bar(); 

    private static Connection bar() { 
     ... 
    } 
} 

は何をしたいということですか?

+0

これは問題ありませんが、conn宣言の行にある未確認の例外のため、コンパイラはエラーを返します。私は何かを逃しているのですか?これは死んだサークルの何人かの王ですか? –

+0

これは、 'bar()'が例外をキャッチし、 'null'を返すか、またはランタイム例外をスローしてプログラムを停止させる場合に機能します。 –

1

可能ですが、接続ファクトリが接続よりも優れています。 しかし、静的変数は接続のライフサイクル制御には適していません。

良好な接続プールは、同時アクセス、タイムアウト検出、アライブ接続のリサイクル、デッド接続の自動削除など、多くの問題に注意します。

0

これは、接続を処理する方法ないです...しかし、それはどのように問題の同様の種類を解決するために、あなたのアイデアを与えるかもしれない:

public class Wombat 
{ 
    public static Wombat getWombat() 
    { 
     if (theWombat == null) 
     theWombat = new Wombat(); 
     return theWombat; 
    } 

    private static Wombat theWombat= null; 
} 
0

あなたは、静的初期化子ブロック内の静的変数を初期化することができます:

class Foo { 
    public static Connection conn; 

    static { 
     try { 
     conn = makeConnection(); 
     } catch(...) { 
     ... 
     } 
    } 
} 
関連する問題