JDBC 取数太慢了怎么办?
Java程序用JDBC连接数据库取数,查询的SQL很简单,数据库负担看起来也不重,也就十几万行数据,要执行十多秒,太慢了,有什么办法提速?
JDBC的性能确实不高,经测试,Oracle的JDBC读数性能比读文本都慢好多倍。JDBC驱动是数据库厂商提供的包,我们在外部没办法提高性能。
如果数据库负担并不重,可以利用多CPU并行取数的办法来提速。用集算器SPL很容易写出这样的代码,比如这样:
A |
B |
|
1 |
fork to(4) |
=connect("ORACLE") |
2 |
=B1.query@x("SELECT * FROM CUSTOMER WHERE MOD(C_CUSTKEY,4)=?",A1-1) |
|
3 |
=A1.conj() |
4个线程分别用JDBC连接数据库取数,读出后的数据再合并起来。如果数据库没什么负担,执行时间差不多能快出4倍。
集算器SPL也提供了JDBC供Java调用,比如把上面的脚本存成load.dfx,在JAVA代码中以存储过程的方式调用脚本文件:
…
Class.forName("com.esproc.jdbc.InternalDriver");
con = DriverManager.getConnection("jdbc:esproc:local://");
st = con.prepareCall("call load()");
st.execute();
ResultSet rs = st.getResultSet();
…
这样就可以享受并行取数的高速了。