Java的数据计算类库RowSet提供了JoinRowSet和FilteredRowSet类,可以进行跨库的关联计算,但是有很多局限。首先,JoinRowSet只支持inner
join,不支持outter join。其次,db2、mysql和hsql经过测试是可以使用JoinRowSet的,但是oracle
11g和其他数据库关联的的时候虽然不报错,但是结果集为空。而oracle11g的两个数据库用户跨库做join,使用JoinRowSet可以得到正确的结果。所以说不同数据库厂家提供的Jdbc实现可能会影响上述方法的结果。第三,就是编程还是有点复杂。
集算器esProc能很好配合java完成跨库连接。集算器支持各种数据库,包括:oracle、db2、mysql、sqlserver、sybase、postgresql等,均可完成多数据混合的inner
join和outter
join等各种跨库关联运算。下面我们通过例子来看一下具体作法:要将db2中的sales表和mysql数据库中的employee表通过sale.sellerid和employee.eid关联,过滤出state=”California”的所有sales和employee数据。例子虽然是db2和mysql,其他数据库的写法也是类似的。
Sales表的结构和数据如下:
Employee表的结构和数据如下:
实现的思路是:用Java程序调用集算器脚本,连接多个数据库实现关联和过滤计算后将结果以ResultSet的方式返回给Java程序。
esProc代码如下:
A1:连接预先配置好的db2数据源。
A2:连接预先配置好的mysql数据源。实际上对于oracle等其他数据库也同样支持。
A3、A4:分别从db2和mysql中读取sales序表和employee序表。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。
A5:使用集算器的对象引用机制,将sales序表和employee序表通过sellerid=eid关联。
A6:按照state="California"过滤序表。
A7:生成一个新的序表,得到需要的字段。
A8:返回给集算器程序的调用者。
在Java程序中使用esProc
JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx):
//建立esProcjdbc连接
Class.forName("com.esproc.jdbc.InternalDriver");
con=
DriverManager.getConnection("jdbc:esproc:local://");
//调用esProc程序(存储过程),其中test是dfx的文件名
com.esproc.jdbc.InternalCStatement st;
st
=(com.esproc.jdbc.InternalCStatement)con.prepareCall("call
test()");
//执行esProc存储过程
st.execute();
//获取结果集
ResultSet set = st.getResultSet();