2017-04-02 121 views
0

我有2個班。 C_DB和C_Test。如何避免在java中重複的數據庫連接?

在C_DB中,getConnection()方法返回一個連接。如果我多次調用getConnection(),它將重新連接到數據庫並返回多個連接。

有沒有辦法避免這種情況?我想檢查一個連接是否存在,然後返回該連接而不是創建一個新連接。所以只有1個連接到db。

C_DB

public class C_DB { 
    Connection con; 

    public C_DB() { 
     String dbLink = "jdbc:mysql://localhost:3306/database"; 
     String dbUser = "root"; 
     String dbPass = ""; 

     try { 
      con = DriverManager.getConnection(dbLink, dbUser, dbPass); 
     } catch (SQLException e) { 
      throw new IllegalStateException("DB Errors: ", e); 
     } 
    } 

    public Connection getConnection() { 
     return con; 
    } 
} 

C_Test

public class C_Test { 

    public static void main(String[] args) throws Exception { 
     Connection con1 = new C_DB().getConnection(); // new connection 
     Connection con2 = new C_DB().getConnection(); // new duplicate connection 
     Connection con3 = new C_DB().getConnection(); // new duplicate connection 
    } 

} 
+0

我想你只是檢查連接是否爲空。 –

+1

使用[**連接池**](https://github.com/brettwooldridge/HikariCP)。 –

+0

我想@Ravi的做法是最好的..這裏是一個例子.http://codethataint.com/blog/using-singleton-class-for-db-connection-java/ –

回答

2

您可以使用連接池,並設置最大池大小爲1,@Elliott在評論中指出或你可以實現這樣的東西。

public class C_DB { 

    private static C_DB instance; 

    private Connection con; 

    private C_DB() { 
     String dbLink = "jdbc:mysql://localhost:3306/database"; 
     String dbUser = "root"; 
     String dbPass = ""; 
     try { 
      con = DriverManager.getConnection(dbLink, dbUser, dbPass); 
     } catch (SQLException e) { 
      throw new IllegalStateException("DB Errors: ", e); 
     } 
    } 

    public static Connection getConnection(){ 
     if(instance == null){ 
      instance = new C_DB(); 
     } 
     return instance.con; 
    } 

} 
+0

以上是非常容易在多錯誤線程化程序。不要這樣做,請使用連接池。 –

0

您應該使用Singleton設計模式,以避免多個實例。

是這樣的:

public class C_DB { 

    private static final Connection con; 
    private static final C_DB singleInstance; 

    private C_DB() { 
     String dbLink = "jdbc:mysql://localhost:3306/database"; 
     String dbUser = "root"; 
     String dbPass = ""; 

     try { 
      con = DriverManager.getConnection(dbLink, dbUser, dbPass); 
     } catch (SQLException e) { 
      throw new IllegalStateException("DB Errors: ", e); 
     } 
    } 

    public static C_DB getInstance() { 
     if (singleInstance == null) { 
      synchronized (C_DB.class) { 
       if (singleInstance == null) { 
        singleInstance = new C_DB(); 
       } 
      } 
     } 

     return singleInstance; 
    } 

    public Connection getConnection() { 
     return con; 
    } 
} 

,並獲得連接爲:

Connection con = C_DB.getInstance().getConnection();