2013-12-18 48 views
6

我創造了這個類返回連接對象。我已經使用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;   
    } 
} 

現在我想要做的就是實例化這個類一次並獲得連接對象。 我想在整個應用程序中使用這個相同的對象。 另一個解決方案也將不勝感激。

+4

考慮使用連接pools.http://stackoverflow.com/questions/2835090/jdbc-connection-pooling – kosa

+1

依賴注入。實例化對象一次,將其傳遞給需要它的每個方法。 – JRizz

回答

7

我想你需要單件模式,下面是簡單的例子:

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

,但是,你應該考慮 - 這將如何在多線程環境中工作,當多個線程試圖向數據庫發出請求時。

+0

@JosefN我可以想像它可以使用單數據庫幾個單線程應用,例如某種它操作數據庫,需要方便地從不同類別的連接長時間運行的工作 –

+0

OK,對不起,我的應用程序目前存在的旬報工作,去清理我的評論。謝謝 – JosefN

1

非常原始的方式,你可以通過

Connect_db.getConnection(數據庫名,用戶名,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);  
} 

}

,如果你的應用程序是有mutlithreaded,應perfom以及使用游泳池

1

我真的很喜歡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();

我說每次都連接到不同的數據庫的能力,在某些情況下,像我們這樣的,這是你需要在做什麼飛。

希望這會有所幫助。

相關問題