JDBC的Oracle兼容性适配

举报
影魔 发表于 2021/11/11 20:16:36 2021/11/11
【摘要】 本文重点介绍什么是JDBC的 Oracle兼容性适配,DWS JDBC做了哪些适配。

什么是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级数仓黑科技,后台还可获取众多学习资料哦~

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。