Tencent / APIJSON

🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构 🏆 Real-Time coding-free, powerful and secure ORM 🚀 providing APIs and Docs without coding by Backend, and the returned JSON of API can be customized by Frontend(Client) users
http://apijson.cn
Other
17.27k stars 2.16k forks source link

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

Open fineday009 opened 4 years ago

fineday009 commented 4 years ago

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

TommyLemon commented 4 years ago

以上方法可行。

也可以自定义 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 commented 4 years ago

以上方法可行。

也可以自定义 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 commented 3 years ago

以上方法可行。

也可以自定义 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 commented 3 years ago

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

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

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

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

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

zhuweijian commented 3 years ago

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

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

TommyLemon commented 3 years ago

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

StaveZhao commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

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 commented 2 years ago

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

TommyLemon commented 2 years ago

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

Redis 对接缓存即可,在 DemoSQLExecutor 重写 getCache, putCache, removeCache 方法 https://github.com/Tencent/APIJSON/issues/90

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

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

anacondapy6 commented 1 year ago

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 commented 1 year ago

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

TommyLemon commented 1 year ago

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

@anacondapy6 也就 3 个目录,点几下就看到这几个配置文件了

https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/resources/application.yml

https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/boot/DemoDataSourceConfig.java

https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/demo/DemoSQLExecutor.java

另外还有专门的两个连接池简单 Demo https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONDemo-Druid/src/main

https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main

以后不要再问这种伸手党问题