Oracle merge insert 问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
create table ENCRYPT.TEST1
(
    A   VARCHAR2(200)  PRIMARY KEY,
    B   VARCHAR2(200),
    C   VARCHAR2(200)
)
/
create table ENCRYPT.TEST2
(
    A   VARCHAR2(200)  PRIMARY KEY,
    B   VARCHAR2(200),
    C   VARCHAR2(200)
)
/

insert into TEST1 values (1,2,3);
insert into TEST1 values (2,3,4);

insert into TEST2 values (4,2,3);

merge into TEST2 fi using TEST1 se on (fi.A = se.A and fi.A = 3)
when matched then update set fi.B = se.B, fi.C = se.C
when not matched then insert (A, B, C) values (1,2,3);

执行如上 SQL 发现一直报 ORA-00001: unique constraint (ENCRYPT.SYS_C007033) violated

No suitable driver 问题调查

背景

用户使用 shardingsphere 发现 No suitable driver 异常。但是用户的 jar 包中是有该驱动的。

调查

发现如果增加这段代码后,可以正常执行

1
Class.forName("com.mysql.cj.jdbc.Driver");

正常而言,按照 JDBC4.0 标准,驱动是通过 spi 机制加载。不需要手动加载。 通过 debug DriverManager 发现其中有个驱动的名称中包含了 - 不是合法的 java 名称。 但是会将异常吞掉,所以没有展示出来。 修复名称后,可以正常使用。

相关知识

JDBC4.0 是通过 spi 加载。 - 不是合法名称,使用 shade 插件替换名称时要注意。 DriverManager 加载多个驱动过程中,如果有任何一个失败,都不会再继续加载,并不会抛出相关异常。

使用 sqlline 连接 sharding_jdbc

https://github.com/julianhyde/sqlline sqlline 是一个通过 jdbc 的连接工具。

  1. 下载代码并编译
git clone git://github.com/julianhyde/sqlline.git
cd sqlline
./mvnw package
  1. 将 shardingsphere-jdbc 打包,之后最好再使用 sharde PLUGIN 打成一个 jar 包

  2. 修改 sqlline bin 目录下的 sqlline 脚本,将相关依赖添加进去包括数据库驱动、shardingsphere shade jar、 sqlline-VERSION-jar-with-dependencies.jar

#!/bin/bash
# sqlline - Script to launch SQL shell on Unix, Linux or Mac OS

BINPATH=$(dirname $0)
exec java -cp "$BINPATH/../target/*":"/Users/chenchuxin/Documents/sqlline-sqlline-1.12.0/bin/*" sqlline.SqlLine "$@"

# End sqlline
  1. 使用 sqlline
 sqlline -d org.apache.shardingsphere.driver.ShardingSphereDriver -u jdbc:shardingsphere:absolutepath:/Users/chenchuxin/Documents/GitHub/sw-test/src/main/resources/META-INF/oracle.yaml

Open_dal

初步了解 opendal

查看 examples 了解到 opendal 是各种数据源的通用连接器

运行接入到 mysql 试试看

查看 good first issue 的相关 pr

分布式 join 实现

如何才能实现分布式 join?

有三种方式:

  • 将数据全部抽取到内存中,进行内存计算。
  • 将数据全部抽取到一个数据源中,直接进行查询。
  • 内存和存储并用。

对于分析型的 SQL 而言,不需要考虑事务和性能的话,可以采用数据挪动的方式来实现。

如下图所示,列出了可能的实现方式。

该方案的具体实现需要考虑 2 点。

  • 语义分析 (考虑通过 calcite 或者自行解析提取条件)
    • 获取表之间的依赖关系,例如 A left join B on condition,那么 B 依赖 A, 可以先将 A 抽取出来,再依据 A 来抽取 B
    • 增加条件到表中
  • 支持数据迁移(需要支持数据迁移的管理)