2017-04-02 78 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();