Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何支持多个数据源? #148

Open
fineday009 opened this issue Oct 28, 2020 · 18 comments
Open

如何支持多个数据源? #148

fineday009 opened this issue Oct 28, 2020 · 18 comments

Comments

@fineday009
Copy link
Collaborator

fineday009 commented Oct 28, 2020

请教下。
比如我有3个数据源,不同ip端口和库表。
直接建3个类,都继承APIJSONSQLConfig来做?
然后对每个数据源,都搞一套连接池

@TommyLemon
Copy link
Collaborator

TommyLemon commented Oct 28, 2020

以上方法可行。

也可以自定义
DemoSQLConfig.java.getDBUri
目前 Demo 里是根据 getDatabase 返回的 数据库类型来区分的,
你可以根据表名或者其它方式来区分,给 getDBUri 返回不同的 uri。
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java

如果需要前端自定义,可以加一个字段用来区分,例如
"@uri": "jdbc:mysql://localhost:3306"
目前需要自己实现,参考 @database, @Schema
https://github.com/APIJSON/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONObject.java

@fineday009
Copy link
Collaborator Author

fineday009 commented Oct 28, 2020

以上方法可行。

也可以自定义
DemoSQLConfig.java.getDBUri
目前 Demo 里是根据 getDatabase 返回的 数据库类型来区分的,
你可以根据表名或者其它方式来区分,给 getDBUri 返回不同的 uri。
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java

如果需要前端自定义,可以加一个字段用来区分,例如
"@uri": "jdbc:mysql://localhost:3306"
目前需要自己实现,参考 @database, @Schema
https://github.com/APIJSON/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONObject.java

了解了,谢谢tommy

@yangjinju
Copy link

yangjinju commented Nov 16, 2020

以上方法可行。

也可以自定义
DemoSQLConfig.java.getDBUri
目前 Demo 里是根据 getDatabase 返回的 数据库类型来区分的,
你可以根据表名或者其它方式来区分,给 getDBUri 返回不同的 uri。
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java

如果需要前端自定义,可以加一个字段用来区分,例如
"@uri": "jdbc:mysql://localhost:3306"
目前需要自己实现,参考 @database, @Schema
https://github.com/APIJSON/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONObject.java

您好,我这边想用前端传入一个 datasourceid,然后后台根据这个参数动态的去 redis(获取其他第三方) 获取数据源的信息(账号,密码,DBuri),再跟 DB 进行连接返回。实际上就是可能有多个DB实例,想让前端根据参数来实现跟哪个DB进行交互,请问这个该怎么实现?
前端参数可能如下:
{ "[]": { "User": { "sex": 1 } }, "datasourceid": 1 // 数据源ID,后台可以根据数据源ID动态的获取数据源的账号,密码,url }

@TommyLemon
Copy link
Collaborator

TommyLemon commented Nov 17, 2020

以上方法可行。
也可以自定义
DemoSQLConfig.java.getDBUri
目前 Demo 里是根据 getDatabase 返回的 数据库类型来区分的,
你可以根据表名或者其它方式来区分,给 getDBUri 返回不同的 uri。
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java
如果需要前端自定义,可以加一个字段用来区分,例如
"@uri": "jdbc:mysql://localhost:3306"
目前需要自己实现,参考 @database, @Schema
https://github.com/APIJSON/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONObject.java

您好,我这边想用前端传入一个 datasourceid,然后后台根据这个参数动态的去 redis(获取其他第三方) 获取数据源的信息(账号,密码,DBuri),再跟 DB 进行连接返回。实际上就是可能有多个DB实例,想让前端根据参数来实现跟哪个DB进行交互,请问这个该怎么实现?
前端参数可能如下:
{ "[]": { "User": { "sex": 1 } }, "datasourceid": 1 // 数据源ID,后台可以根据数据源ID动态的获取数据源的账号,密码,url }

可以在 DemoObjectParser 重写 newSQLConfig ,取出 datasourceid(建议改用 @datasourceId 这样的关键词)并赋值给 SQLConfig

https://github.com/APIJSON/APIJSON-Demo/blob/316b4411eec25a4fd1137fd69fb1de1171e75a57/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoObjectParser.java

	@Override
 	public SQLConfig newSQLConfig(RequestMethod method, String table, String alias, JSONObject request, List<Join> joinList, boolean isProcedure) throws Exception {
 	       DemoSQLConfig config = super.newSQLConfig(method, table, alias, request, joinList, isProcedure);
 	       Map<String, Object> map = getCustomMap();
 	       Integer datasourceId = map == null ? null : map.get("@datasourceId");
 	       config.setDatasourceId(datasourceId == null ? 0 : datasourceId);
 	       return config;
 	}

然后在 DemoSQLConfig 新增一个成员变量 datasourceId,通过它来提供 dbUri, dbAccount, dbPassword, database, schema 等属性。
https://github.com/APIJSON/APIJSON-Demo/blob/316b4411eec25a4fd1137fd69fb1de1171e75a57/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java

@yangjinju
Copy link

yangjinju commented Nov 17, 2020

以上方法可行。
也可以自定义
DemoSQLConfig.java.getDBUri
目前 Demo 里是根据 getDatabase 返回的 数据库类型来区分的,
你可以根据表名或者其它方式来区分,给 getDBUri 返回不同的 uri。
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java
如果需要前端自定义,可以加一个字段用来区分,例如
"@uri": "jdbc:mysql://localhost:3306"
目前需要自己实现,参考 @database, @Schema
https://github.com/APIJSON/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONObject.java

您好,我这边想用前端传入一个 datasourceid,然后后台根据这个参数动态的去 redis(获取其他第三方) 获取数据源的信息(账号,密码,DBuri),再跟 DB 进行连接返回。实际上就是可能有多个DB实例,想让前端根据参数来实现跟哪个DB进行交互,请问这个该怎么实现?
前端参数可能如下:
{ "[]": { "User": { "sex": 1 } }, "datasourceid": 1 // 数据源ID,后台可以根据数据源ID动态的获取数据源的账号,密码,url }

可以在 DemoObjectParser 重写 newSQLConfig ,取出 datasourceid(建议改用 @datasourceId 这样的关键词)并赋值给 SQLConfig

https://github.com/APIJSON/APIJSON-Demo/blob/316b4411eec25a4fd1137fd69fb1de1171e75a57/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoObjectParser.java

	@Override
 	public SQLConfig newSQLConfig(RequestMethod method, String table, String alias, JSONObject request, List<Join> joinList, boolean isProcedure) throws Exception {
 	       DemoSQLConfig config = super.newSQLConfig(method, table, alias, request, joinList, isProcedure);
 	       Map<String, Object> map = getCustomMap();
 	       Integer datasourceId = map == null ? null : map.get("@datasourceId");
 	       config.setDatasourceId(datasourceId == null ? 0 : datasourceId);
 	       return config;
 	}

然后在 DemoSQLConfig 新增一个成员变量 datasourceId,通过它来提供 dbUri, dbAccount, dbPassword, database, schema 等属性。
https://github.com/APIJSON/APIJSON-Demo/blob/316b4411eec25a4fd1137fd69fb1de1171e75a57/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java

试了下使用 @datasourceId,但是在重写 newSQLConfig 方法里的 JSONObject request 参数没有把 @datasourceId 带过来,request.getIntValue("@datasourceId") 一直都是 0,这里需要把 @datasourceId 怎么处理才能接受到呢?

@TommyLemon
Copy link
Collaborator

TommyLemon commented Nov 17, 2020

以上方法可行。
也可以自定义
DemoSQLConfig.java.getDBUri
目前 Demo 里是根据 getDatabase 返回的 数据库类型来区分的,
你可以根据表名或者其它方式来区分,给 getDBUri 返回不同的 uri。
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java
如果需要前端自定义,可以加一个字段用来区分,例如
"@uri": "jdbc:mysql://localhost:3306"
目前需要自己实现,参考 @database, @Schema
https://github.com/APIJSON/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONObject.java

您好,我这边想用前端传入一个 datasourceid,然后后台根据这个参数动态的去 redis(获取其他第三方) 获取数据源的信息(账号,密码,DBuri),再跟 DB 进行连接返回。实际上就是可能有多个DB实例,想让前端根据参数来实现跟哪个DB进行交互,请问这个该怎么实现?
前端参数可能如下:
{ "[]": { "User": { "sex": 1 } }, "datasourceid": 1 // 数据源ID,后台可以根据数据源ID动态的获取数据源的账号,密码,url }

可以在 DemoObjectParser 重写 newSQLConfig ,取出 datasourceid(建议改用 @datasourceId 这样的关键词)并赋值给 SQLConfig
https://github.com/APIJSON/APIJSON-Demo/blob/316b4411eec25a4fd1137fd69fb1de1171e75a57/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoObjectParser.java

	@Override
	public SQLConfig newSQLConfig(RequestMethod method, String table, String alias, JSONObject request, List<Join> joinList, boolean isProcedure) throws Exception {
	       DemoSQLConfig config = super.newSQLConfig(method, table, alias, request, joinList, isProcedure);
	       Map<String, Object> map = getCustomMap();
	       Integer datasourceId = map == null ? null : map.get("@datasourceId");
	       config.setDatasourceId(datasourceId == null ? 0 : datasourceId);
	       return config;
	}

然后在 DemoSQLConfig 新增一个成员变量 datasourceId,通过它来提供 dbUri, dbAccount, dbPassword, database, schema 等属性。
https://github.com/APIJSON/APIJSON-Demo/blob/316b4411eec25a4fd1137fd69fb1de1171e75a57/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java

试了下使用 @datasourceId,但是在重写 newSQLConfig 方法里的 JSONObject request 参数没有把 @datasourceId 带过来,request.getIntValue("@datasourceId") 一直都是 0,这里需要把 @datasourceId 怎么处理才能接受到呢?

忘说了,这个 request 参数是对应 User 对象的,@datasourceId 应该写在对象里面

{ "[]": { "User": { "sex": 1, "@datasourceId": 1 } }

如果要支持全局默认参数(写在最外层),参考 @database, @Schema 在 APIJSONParser 和 APIJSONObjectParser 两个地方的处理

@TommyLemon
Copy link
Collaborator

以上方法可行。
也可以自定义
DemoSQLConfig.java.getDBUri
目前 Demo 里是根据 getDatabase 返回的 数据库类型来区分的,
你可以根据表名或者其它方式来区分,给 getDBUri 返回不同的 uri。
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java
如果需要前端自定义,可以加一个字段用来区分,例如
"@uri": "jdbc:mysql://localhost:3306"
目前需要自己实现,参考 @database, @Schema
https://github.com/APIJSON/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONObject.java

您好,我这边想用前端传入一个 datasourceid,然后后台根据这个参数动态的去 redis(获取其他第三方) 获取数据源的信息(账号,密码,DBuri),再跟 DB 进行连接返回。实际上就是可能有多个DB实例,想让前端根据参数来实现跟哪个DB进行交互,请问这个该怎么实现?
前端参数可能如下:
{ "[]": { "User": { "sex": 1 } }, "datasourceid": 1 // 数据源ID,后台可以根据数据源ID动态的获取数据源的账号,密码,url }

可以在 DemoObjectParser 重写 newSQLConfig ,取出 datasourceid(建议改用 @datasourceId 这样的关键词)并赋值给 SQLConfig
https://github.com/APIJSON/APIJSON-Demo/blob/316b4411eec25a4fd1137fd69fb1de1171e75a57/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoObjectParser.java

	@Override
 	public SQLConfig newSQLConfig(RequestMethod method, String table, String alias, JSONObject request, List<Join> joinList, boolean isProcedure) throws Exception {
 	       DemoSQLConfig config = super.newSQLConfig(method, table, alias, request, joinList, isProcedure);
 	       Map<String, Object> map = getCustomMap();
 	       Integer datasourceId = map == null ? null : map.get("@datasourceId");
 	       config.setDatasourceId(datasourceId == null ? 0 : datasourceId);
 	       return config;
 	}

然后在 DemoSQLConfig 新增一个成员变量 datasourceId,通过它来提供 dbUri, dbAccount, dbPassword, database, schema 等属性。
https://github.com/APIJSON/APIJSON-Demo/blob/316b4411eec25a4fd1137fd69fb1de1171e75a57/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java

试了下使用 @datasourceId,但是在重写 newSQLConfig 方法里的 JSONObject request 参数没有把 @datasourceId 带过来,request.getIntValue("@datasourceId") 一直都是 0,这里需要把 @datasourceId 怎么处理才能接受到呢?

新增数据源关键词 @Datasource,可由业务完全自定义
https://github.com/Tencent/APIJSON/releases/tag/4.7.0

@TommyLemon
Copy link
Collaborator

TommyLemon commented Jun 21, 2021

新增 连接池及多数据源 Demo(Druid + HikariCP)
https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server

@zhuweijian
Copy link

新增 连接池及多数据源 Demo(Druid + HikariCP) https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server

请问 这个多数据源的demo怎么配置使用,有相关文档吗?我下载这个代码尝试配置了几种的可能方式都不对

@TommyLemon
Copy link
Collaborator

@StaveZhao
Copy link

https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server

按这个 Demo 来,SpringBoot yaml 配置加 APIJSON AbstractSQLEexcutor 配置 https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource

Demo里边也没有写如何切换数据源呀,这个是需要前端请求的时候传什么参数吗???

@TommyLemon
Copy link
Collaborator

TommyLemon commented Nov 4, 2021

https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server

按这个 Demo 来,SpringBoot yaml 配置加 APIJSON AbstractSQLEexcutor 配置 https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource

Demo里边也没有写如何切换数据源呀,这个是需要前端请求的时候传什么参数吗???

前端传 @datasource
https://github.com/Tencent/APIJSON/blob/master/Document.md#3.2

@StaveZhao
Copy link

https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server

按这个 Demo 来,SpringBoot yaml 配置加 APIJSON AbstractSQLEexcutor 配置 https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource

Demo里边也没有写如何切换数据源呀,这个是需要前端请求的时候传什么参数吗???

前端传 @datasource https://github.com/Tencent/APIJSON/blob/master/Document.md#3.2

谢谢

@snipercy
Copy link

@TommyLemon hi,TommyLemon,现在数据源有支持redis吗?有的话是否有demo?没有的话,如果要实现,你觉得应该怎么实现,需要注意什么?

@TommyLemon
Copy link
Collaborator

TommyLemon commented Jan 18, 2022

@TommyLemon hi,TommyLemon,现在数据源有支持redis吗?有的话是否有demo?没有的话,如果要实现,你觉得应该怎么实现,需要注意什么?

Redis 对接缓存即可,在 DemoSQLExecutor 重写 getCache, putCache, removeCache 方法
#90

注意缓存过期,需要自己根据业务需要来更新缓存。

可以在 Request 表配置增删改数据后调用自定义的 远程函数 来删改对应的缓存

@anacondapy6
Copy link

https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server

按这个 Demo 来,SpringBoot yaml 配置加 APIJSON AbstractSQLEexcutor 配置 https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource

Demo里边也没有写如何切换数据源呀,这个是需要前端请求的时候传什么参数吗???

前端传 @datasource https://github.com/Tencent/APIJSON/blob/master/Document.md#3.2

多源数据库Access的配置还在默认数据库上么?

@anacondapy6
Copy link

https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server

按这个 Demo 来,SpringBoot yaml 配置加 APIJSON AbstractSQLEexcutor 配置 https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource

SpringBoot yaml 配置加 APIJSON AbstractSQLEexcutor 配置 这个是怎么加的,没找到地方啊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants