【问题标题】:Create a connection into 2 databases from java application从 java 应用程序创建到 2 个数据库的连接
【发布时间】:2013-10-02 03:37:53
【问题描述】:

我有 Connection 类的代码,它只从一个数据库获取连接。看下面的DBConnection.java

package eksim.db.sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class DBConnection {

    public Connection conn=null;
    private static DBConnection dbConn=null;
    static final String DB_URL=
            "jdbc:sqlserver://10.0.0.47\\test;databaseName=a;";
    static final String DB_USER="sa";
    static final String DB_PASS="123";




    public DBConnection(){
         if(conn==null){
             try{
                 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
                 conn=DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
             }
             catch(Exception ex){
                 ex.printStackTrace();
             }
         }
    }





    public static  DBConnection getInstance(){
        DBConnection conn=null;
        if(dbConn==null){
            System.out.println("New");
            dbConn=new DBConnection();
            conn=dbConn;
        } else{
            conn=dbConn;
        }
        return conn;
    }
    public Connection getCon() throws SQLException{
        return this.conn;
    }
}

现在,我想创建另一个到不同数据库的连接。任何人都可以给我建议修改此代码以便将 Connection 的结果放入 2 个数据库中吗?感谢您的任何回复

【问题讨论】:

    标签: java sql-server database connection


    【解决方案1】:

    您需要提供一些方法来识别不同的连接,还要配置这些连接。

    您可以提供一个newInstance 方法,并为其传递一个名称,该名称用于标识连接以及创建该连接所需的连接属性。

    然后,当您想要获得对连接的引用时,您可以简单地使用getInstance(name)

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.Map;
    
    public class DBConnection {
    
        public Connection conn = null;
    
        private static Map<String, DBConnection> mapInstances = new HashMap<String, DBConnection>(25);
    
        private String dbURL;
        private String dbUser;
        private String dbPassword;
    
        private DBConnection(String dbURL, String dbUser, String dbPassword) {
            this.dbPassword = dbPassword;
            this.dbURL = dbURL;
            this.dbUser = dbUser;
        }
    
        public synchronized static DBConnection newInstance(String name, String dbURL, String dbUser, String dbPassword) {
            DBConnection con = new DBConnection(dbURL, dbUser, dbPassword);
            mapInstances.put(name, con);
            return con;
        }
    
        public synchronized static DBConnection getInstance(String name) {
            return mapInstances.get(name);
        }
    
        public synchronized Connection getCon() throws SQLException {
            if (conn == null) {
                try {
                    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
                    conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            return this.conn;
        }
    
    }
    

    例如...

    DBConnection db1 = DBConnection.newInstance("db1", ....);
    DBConnection db2 = DBConnection.newInstance("db2", ....);
    

    当你想再次访问连接时......

    DBConnection db1 = DBConnection.getInstance("db1");
    DBConnection db2 = DBConnection.getInstance("db2");
    

    【讨论】:

    • 认为最好有 ConcurrentHashMap 而不是 HashMap ,在使用几乎所有时间的线程时会更好:)
    • @AnanthaSharma 这当然是一个有效的观点,但两个实例方法是synchronized
    【解决方案2】:
    public class DBConnection {
    
    public Connection conn=null;
    private static DBConnection dbConn=null;
    static final String DB_URL=
            "jdbc:sqlserver://10.0.0.47\\test;databaseName=a;";
    static final String DB_USER="sa";
    static final String DB_PASS="123";
    
    
     public Connection secCon=null;
    static final String DB_URL_SECOND= // URL
    
    static final String DB_USER_SECOND=""; // user name
    static final String DB_PASS_SECOND="123";
    
    
    
    
    public DBConnection(){
         if(conn==null){
             try{
                 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
                 conn=DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
                 secCon=DriverManager.getConnection(DB_URL_SECOND, DB_USER_SECOND, DB_PASS_SECOND);
             }
             catch(Exception ex){
                 ex.printStackTrace();
             }
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 2017-08-25
      • 2014-07-08
      • 1970-01-01
      • 2016-04-15
      • 2017-04-08
      • 1970-01-01
      • 2011-12-04
      相关资源
      最近更新 更多