Tencent/APIJSON

如何支持多个数据源?

fineday009 opened this issue · 18 comments

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

以上方法可行。

也可以自定义
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

以上方法可行。

也可以自定义
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

以上方法可行。

也可以自定义
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 }

以上方法可行。
也可以自定义
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

以上方法可行。
也可以自定义
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 怎么处理才能接受到呢?

以上方法可行。
也可以自定义
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 两个地方的处理

以上方法可行。
也可以自定义
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

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

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

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

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里边也没有写如何切换数据源呀,这个是需要前端请求的时候传什么参数吗???

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

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

谢谢

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

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

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

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

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

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的配置还在默认数据库上么?

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 配置 这个是怎么加的,没找到地方啊