连接shardingsphere-proxy使用什么客户端工具应该是很多使用shardingsphere-proxy的人非常关心的问题。本文将介绍本人在使用过程中的经历,并给出什么客户端工具能更好的兼容shardingsphere-proxy的答案。

最近在配置shardingsphere-proxy代理postgrepsql,调试连接后在查看表列表时,遇到错误“No value specified for parameter 1”。

调试过程:

1.使用dbeaver配置连接,最后再打开public schema展示表结构时,提示错误:No value specified for parameter 1

同时查看代理端日志:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[INFO ] 2023-03-06 16:36:25.915 [Connection-10-ThreadExecutor] o.a.s.p.b.h.a.e.AbstractDatabaseMetaDataExecutor$DefaultDatabaseMetaDataExecutor - Actual SQL: ds_0 ::: SELECT c.oid,c.*,d.description,pg_catalog.pg_get_expr(c.relpartbound, c.oid) as partition_expr,  pg_catalog.pg_get_partkeydef(c.oid) as partition_key 
FROM pg_catalog.pg_class c
LEFT OUTER JOIN pg_catalog.pg_description d ON d.objoid=c.oid AND d.objsubid=0 AND d.classoid='pg_class'::regclass
WHERE c.relnamespace=? AND c.relkind not in ('i','I','c')
[ERROR] 2023-03-06 16:36:25.918 [Connection-10-ThreadExecutor] o.a.s.p.f.c.CommandExecutorTask - Exception occur: 
org.postgresql.util.PSQLException: No value specified for parameter 1.
	at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:284)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:340)
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:490)
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:408)
	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:181)
	at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:133)
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
	at org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor$DefaultDatabaseMetaDataExecutor.getSourceData(AbstractDatabaseMetaDataExecutor.java:225)
	at org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.execute(AbstractDatabaseMetaDataExecutor.java:76)
	at org.apache.shardingsphere.proxy.backend.handler.admin.DatabaseAdminQueryBackendHandler.execute(DatabaseAdminQueryBackendHandler.java:56)
	at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal.bind(Portal.java:103)
	at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.bind.PostgreSQLComBindExecutor.execute(PostgreSQLComBindExecutor.java:53)
	at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.PostgreSQLAggregatedCommandExecutor.execute(PostgreSQLAggregatedCommandExecutor.java:41)
	at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:110)
	at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.java:77)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

2.更换heidisql,配置好连接后,发现虽然可以连接,但是根本无法展开连接节点,什么也做不了

3.使用命令行测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
psql -h 10.10.2.1 -p 3307 -d db_xxx -U root
\db
列出数据库
\dt
这命令在这里貌似没用

列出表应该用这个
select tablename from pg_tables where schemaname='public';

其他查询
/* ShardingSphere hint: 
disableAuditNames=sharding_key_required_auditor */ 
select * from t_order;

发现命令行是可行的,所以说,是客户端工具的原因。

查询官方文档,发现有一段关于“Proxy 在使用ShardingSphere-Proxy 时, 怎么使用合适的工具连接到

ShardingSphere-Proxy?”的回答为:

1
2
3
4
5
6
7
回答:
1. ShardingSphere‐Proxy 可以看做是一个database server,所以首选支持SQL 命令连接和操作。
2. 如果使用其他第三方数据库工具,可能由于不同工具的特定实现导致出现异常。
3. 目前已测试的第三方数据库工具如下:
• DataGrip:2020.1、2021.1(使用IDEA/DataGrip 时打开introspect using JDBC
metadata 选项)。
• MySQLWorkBench:8.0.25。

4.使用DataGrip

datagrip连接shardingsphere配置

注意勾选:Introspect using JDBC metadata

但我们使用hint,即comment写法时,会不生效,会报如下错误:

[44000] ERROR: SQL check failed, error message: Not allow DML operation without sharding conditions.

可以通过以下配置解决:

让查询支持comment的配置方法

结论:

客户端工具可以使用DataGrip提供完美支持。