数据源与简单连接数据库

时间:2013-02-01 20:10:03

标签: java .net database connection datasource

什么是最好的方法?,我需要连接许多远程数据库来解决来自Restful Web服务的许多请求。我在想两个解决方案:

  1. 每个远程数据库有一个数据源,每个数据源的连接就像一个单例模式。

  2. 每个远程数据库有一个简单的连接,只需要一个单独的模式来连接每个数据库。

  3. 第一种方法的一个例子是这样的(víammsdn):

    import java.sql.*;
    import com.microsoft.sqlserver.jdbc.*;
    
    public class connectDS {
    
    public static void main(String[] args) {
    
      // Declare the JDBC objects.
      Connection con = null;
      CallableStatement cstmt = null;
      ResultSet rs = null;
    
      try {
         // Establish the connection. 
         SQLServerDataSource ds = new SQLServerDataSource();
         ds.setUser("UserName");
         ds.setPassword("*****");
         ds.setServerName("localhost");
         ds.setPortNumber(1433); 
         ds.setDatabaseName("AdventureWorks");
         con = ds.getConnection();
    
         // Execute a stored procedure that returns some data.
         cstmt = con.prepareCall("{call dbo.uspGetEmployeeManagers(?)}");
         cstmt.setInt(1, 50);
         rs = cstmt.executeQuery();
    
         // Iterate through the data in the result set and display it.
         while (rs.next()) {
            System.out.println("EMPLOYEE: " + rs.getString("LastName") + 
               ", " + rs.getString("FirstName"));
            System.out.println("MANAGER: " + rs.getString("ManagerLastName") + 
               ", " + rs.getString("ManagerFirstName"));
            System.out.println();
         }
      }
    
      // Handle any errors that may have occurred.
      catch (Exception e) {
         e.printStackTrace();
      }
      finally {
         if (rs != null) try { rs.close(); } catch(Exception e) {}
         if (cstmt != null) try { cstmt.close(); } catch(Exception e) {}
         if (con != null) try { con.close(); } catch(Exception e) {}
         System.exit(1);
      }
     }
    }
    

    对于第二种方法,单例示例可以是:

    public java.sql.Connection conn;
    private static Statement statement;
    
    public static MysqlConnect db;
    
    private MysqlConnect() {
        String url= "jdbc:mysql://localhost:3306/";
        String dbName = "Banco";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "root";
        String password = "123456";
        try {
            Class.forName(driver).newInstance();
            this.conn = (java.sql.Connection)DriverManager.getConnection(url+dbName,userName,password);
            System.out.println("Connected to DataBase: " + dbName);
        }
        catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException sqle) {
            System.out.println("Error Inesperado en MysqlConnect" + sqle.toString());
        }
    }
    
    /**
     *Method for connect to a database
     * @return MysqlConnect Database connection object
     */
    public static synchronized MysqlConnect getDbCon() {
        if ( db == null ) {
            try {
                db = new MysqlConnect();
                statement = db.conn.createStatement();
            } catch (SQLException ex) {
                Logger.getLogger(MysqlConnect.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        System.out.println("Connection to DB: OK");
        return db;
    }
    

2 个答案:

答案 0 :(得分:0)

这取决于数据库与查询之间的关系。如果您有大量查询要访问单个数据库(例如用户数据库),那么您将需要多个连接,否则您将最终阻止该资源上的线程。

最灵活的方法是为每个远程数据库建立一个连接池,并根据在任何单个REST事务中查询的可能性,配置每个远程数据库以使它们具有适当数量的连接。

一个好的起点可能是查看Tomcat数据源池。请注意,无论您是否将Tomcat用作Web服务器,都可以使用它。

答案 1 :(得分:0)

多个线程不能同时使用Connection,而DataSource可以使用{{1}}。