postgres如何从多个数据库中获取数据

时间:2015-01-15 05:46:14

标签: java postgresql jdbc

我在不同的端口上有2个PostgreSQL数据库:端口5432上的DB1和端口5431上的DB2

我有代码从DB1获取数据:

try {
    Class.forName("org.postgresql.Driver");
    String conString = "jdbc:postgresql://127.0.0.1:5432/DB1?user=MyUser&pass=MyPass" ; 
    c = DriverManager.getConnection(conString);
      st = c.createStatement();
      ResultSet rs = st.executeQuery(query);
      while (rs.next()){
          vaArrL.add(rs.getDouble("va"));
          vbArrL.add(rs.getDouble("vb"));
          vcArrL.add(rs.getDouble("vc"));
      }

并且只在我发送单个查询到DB1时工作正常。  但现在,我一起查询两个数据库,如:

select va, vb from  DB1.public.t1 where datatime >=  1417384860 and datatime <=  1417381199 
union  
select va, vb from dblink('hostaddr=127.0.0.1 port=5431 dbname=DB2 user=MyUser password =MyPass '::text,
           'select va, vb 
            from Db2.public.t2 order by datatime ')
            datos(va integer,vb integer);

当我从pgAdmin运行查询时,我得到结果

但是当我向gunction发送查询时,我得到:连接不可用

现在。如何将查询发送到函数并获取值?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用JDBC的setCatalog方法吗?

setCatalog's javadoc声明:

  

调用setCatalog对以前创建或准备没有影响   声明对象。它是实现定义DBMS是否准备   Connection方法时立即进行操作   调用prepareStatement或prepareCall。为了最大的便携性,   应在创建或准备Statement之前调用setCatalog。

try {
    Class.forName("org.postgresql.Driver");
    // Connect to DB1 (specified in connection string/URL).
    String conString = "jdbc:postgresql://127.0.0.1:5432/DB1?user=MyUser&pass=MyPass" ; 
    c = DriverManager.getConnection(conString);
    st = c.createStatement();

    // Execute query on DB1.
    ResultSet rs = st.executeQuery(query);
    while (rs.next()){
        vaArrL.add(rs.getDouble("va"));
        vbArrL.add(rs.getDouble("vb"));
        vcArrL.add(rs.getDouble("vc"));
    }

    // Switch to DB2 and execute query.
    c.setCatalog("DB2");    
    Statement st2 = c.createStatement();
    ResultSet rs2 = st2.executeQuery(...);
}

如果JDBC驱动程序不支持setCatalog,那么您可以显式执行SQL查询USE DB2,但这可能会影响已打开的语句(我对此不确定)


编辑:OP希望同一ResultSet中两个数据库的所有结果。

假设DB1和DB2位于同一服务器上,我建议在数据库DB1中创建一个视图,该视图可以访问数据库DB2中的表并返回组合结果。然后,您可以通过JDBC从视图中SELECT *获得结果。

您可以对视图使用这样的查询(假设视图是在DB1中创建的):

SELECT all.va, all.vb FROM
    (SELECT va, vb, datatime FROM t2
     UNION
    SELECT va, vb, datatime FROM DB2.public.t2) all
ORDER BY all.datatime

注意:要访问另一个数据库中的表,需要指定[db-name]。[schema]。[tablename]。

如果您的查询需要动态参数,则可以创建存储过程而不是视图。

答案 1 :(得分:0)

我找到了1个解决方案 我使用2连接并发送到客户端到xmlrpc服务器的查询,这里:

String conString = "jdbc:postgresql://" + host + ":" + port + "/" + DBName + 
            "?user=" + user + "&pass=" + pass;

String conString1 = "jdbc:postgresql://" + host + ":" + port2 + "/" + DBName2 + 
            "?user=" + user + "&pass=" + pass;

       c = DriverManager.getConnection(conString);
      c2 = DriverManager.getConnection(conString1);

      st = c.createStatement();
      st2 = c2.createStatement();       
          List<ResultSet> resultSets = new ArrayList<>();
          resultSets.add(st.executeQuery(query));
          resultSets.add(st2.executeQuery(query2));
           ResultSets rs = new ResultSets(resultSets);
      while (rs.next()){
          unbArrL.add(rs.getUnbalance("unbalance"));
      }
从p获取值的

和resultSets类是:

class ResultSets {

 private java.util.List<java.sql.ResultSet> resultSets;

    private java.sql.ResultSet current;


    public ResultSets(java.util.List<java.sql.ResultSet> resultSets) {
        this.resultSets = new java.util.ArrayList<>(resultSets);
        current = resultSets.remove(0);
    }

    public boolean next() throws SQLException {
        if (current.next()) {
            return true;
        }else if (!resultSets.isEmpty()) {
            current = resultSets.remove(0);
            return next();
        }
        return false;
    }
    public Double getUnbalance(String unbalance) throws SQLException{
        return current.getDouble("unbalance");
    }

}