JDBC的Oracle兼容性适配
什么是JDBC的Oracle兼容性适配?
顾名思义,Oracle兼容性适配,是为了兼容Oracle,JDBC的Oracle兼容性适配,就是修改当前的JDBC的行为,使其能够在部分行为上与Oracle的JDBC保持一致。
为什么要做JDBC的Oracle兼容性适配?
众所周知,DWS脱胎于PG,周边的生态也是PG的生态,既然如此,为什么要兼容Oracle呢,这是因为很多客户当前使用的数据库是Oracle,数据库驱动自然也是Oracle的驱动,上层的应用也是基于Oracle的驱动来开发的,这个时候如果客户想从Oracle切成高斯的数据库,就面临一个问题,当前的应用就要从基于Oracle JDBC改为基于DWS JDBC驱动,对于复杂而庞大的应用系统,这种改动是相当困难的,为了让客户能完成切换,我们就有必要为客户解决这个难题,因此我们就需要对DWS的JDBC做一些改造,让客户的应用侧不需要做大规模修改,就可以切换到我们的高斯数据库,这就是所谓JDBC的Oracle兼容性适配。
都做了哪些适配?
Blob、Clob数据的导入导出
在这之前DWS的JDBC并不支持Blob、Clob数据类型的导入和导出,没办法通过JDBC将数据插入到数据库中的blob、clob字段,即使手动在数据库后台将数据插入,应用侧也没办法通过JDBC将数据读出。经过适配开发,DWS的JDBC可通过jdk标准接口将Blob、Clob数据导入导出。
代码实例:
//blob数据插入,方法1
Blob blob = con.createBlob();
PreparedStatement ps = con.prepareStatement("insert into blob_test values(?,?)");
InputStream in = new FileInputStream("E:\\test.PNG");
OutputStream out = blob.setBinaryStream(1);
byte[] tmp = new byte[in.available()];
int length;
while((length = in.read(tmp)) != -1){
out.write(tmp,0,length);
}
ps.setInt(1, 1);
ps.setBlob(2, blob);
ps.execute();
//blob数据插入,方法2
Blob blob = con.createBlob();
PreparedStatement ps = con.prepareStatement("insert into blob_test values(?,?)");
InputStream in = new FileInputStream("E:\\test.PNG");
ps.setInt(1, 1);
ps.setBlob(2, in, in.available());
ps.execute();
//blob数据读取
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from blob_test");
rs.next();
Blob blob = rs.getBlob(2);
InputStream is = blob.getBinaryStream();
FileOutputStream fo = new FileOutputStream("E:\\test2.PNG");
byte[] buff = new byte[1024];
while(is.read(buff) != -1){
fo.write(buff);
}
is.close();
fo.close();
//Clob数据导入
Clob clob = con.createClob();
clob.setString(1, "just a test");
PreparedStatement ps = con.prepareStatement("insert into clob_test values(?)");
ps.setClob(1, clob);
ps.execute();
//Clob数据导出
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from test");
rs.next();
clob = rs.getClob(1);
System.out.println(clob.getSubString(1, (int)clob.length()));
除此之外,还做了其他一些微小的改动,比如支持数据类型之间的转换,例如,支持将out类型为int的数据,以字符串取出:
数据库端:
CREATE OR REPLACE PROCEDURE proc_integer(O OUT integer)
IS
BEGIN
O := 1;
END;
/
客户端:
//out类型:int,注册类型:VARCHAR
CallableStatement cs = con.prepareCall("{? = call proc_integer()}");
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
System.out.println(cs.getString(1));
cs.close();
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~
- 点赞
- 收藏
- 关注作者
评论(0)