我在不同的端口上有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发送查询时,我得到:连接不可用
现在。如何将查询发送到函数并获取值?
答案 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");
}
}