不少人误以为 d2js 只能通过 database.js 指定一个数据库,是一个单数据库方案。实际上 d2js 也可以使用多个数据库。

在 WEB-INF/jslib/d2js/base.js 的末尾,是 dj2s 创建 DataSource 为 d2js 的 SqlExecutor 的主要代码:

D2JS.init = function(){

    var datasource = application.datasource || (application.datasource = (function(){
var properties = new java.util.Properties();
for(var k in datasourceConfig){
properties.setProperty(k, datasourceConfig[k] + '');
}
return Java.type('org.apache.commons.dbcp2.BasicDataSourceFactory').createDataSource(properties);
}())); var sqlExecutor = new org.siphon.jssql.SqlExecutor(datasource, engine, JSON);
sqlExecutor.defaultJsonDbType = datasourceConfig.defaultJsonDbType || 'JSONB';
sqlExecutor.columnNameCase = datasourceConfig.columnNameCase || 0; // LOWER
sqlExecutor.useColumnLabelAsName = datasourceConfig.useColumnLabelAsName || false; ; d2js = handler = new D2JS(sqlExecutor);
engine.put('handler', handler);
engine.put('d2js', d2js);
}

这个 D2JS.init 函数在 application.d2js.js 和 application.jssp.js 中调用。

通过自定义 D2JS.init 函数,可以自定义数据库连接。

如对于spring,可编写 spring-datasource.js :

D2JS.init = function(){

    var sqlExecutor = D2JS.createExecutorForDataSource("dataSource");

    d2js = handler = new D2JS(sqlExecutor);
engine.put('handler', handler);
engine.put('d2js', d2js); } D2JS.createExecutorForDataSource = function(beanName){
var WebApplicationContextUtils = Java.type('org.springframework.web.context.support.WebApplicationContextUtils');
var wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
var datasource = wac.getBean(beanName);
var sqlExecutor = new org.siphon.jssql.SqlExecutor(datasource, engine);
sqlExecutor.columnNameCase = 1; // KEEP
sqlExecutor.useColumnLabelAsName = true;
return sqlExecutor;
}

对于其它数据源,如 h2 db 可编写:

    var executor = (function createMemExecutor(){
var datasource = (function(){
var properties = new java.util.Properties();
for(var k in datasourceConfig){
properties.setProperty(k, datasourceConfig[k] + '');
}
return Java.type('org.apache.commons.dbcp2.BasicDataSourceFactory').createDataSource(properties);
})(); var sqlExecutor = new org.siphon.jssql.SqlExecutor(datasource, engine);
sqlExecutor.columnNameCase = datasourceConfig.columnNameCase || 0; // LOWER
sqlExecutor.useColumnLabelAsName = true;
return sqlExecutor;
})();

修改 application.d2js.js 和 application.jssp.js,在  imports("jslib/d2js.js"); 后执行

imports("./spring-datasource.js");

这样,spring-datasource.js 中的 D2JS.init 就覆盖了 base.js 中原来的 D2JS.init,实现了使用 spring 数据源或其它数据源。

如何让多个数据源并存呢?

如上面的内存数据源,登记为 d2js.memSqlExecutor。

    d2js.memSqlExecutor = (function createMemExecutor(){
var datasource = (function(){
var properties = new java.util.Properties();
for(var k in datasourceConfig){
properties.setProperty(k, datasourceConfig[k] + '');
}
return Java.type('org.apache.commons.dbcp2.BasicDataSourceFactory').createDataSource(properties);
})(); var sqlExecutor = new org.siphon.jssql.SqlExecutor(datasource, engine);
sqlExecutor.columnNameCase = datasourceConfig.columnNameCase || 0; // LOWER
sqlExecutor.useColumnLabelAsName = true;
return sqlExecutor;
})();

前面的博客介绍过,每个 d2js 实例都是从 d2js 对象复制的,所以每个 d2js 实例都会拥有 memSqlExecutor 成员。

使用时只要通过 this.executor = d2js.memSqlExecutor 就可以切换数据源(记得切换回来)。

如考虑为web容器环境,也可将设为 application.memSqlExecutor。

如果需要对多个数据源前后执行同一条语句,可按如下操作:

d2js.test = function(){
[sqlExecutor1, sqlExecutor2, this.executor].forEach(function(executor){
this.executor = executor; // 循环过程依次切换为 sqlExecutor1, sqlExecutor2, this.executor this.execute(sql, {args})
}, this)
}

这个办法只有一个 d2js 对象,此外也可直接创建一些真正的 d2js 对象。

    var d = new D2JS(this.executor);
for(var k in this){
if(this.hasOwnProperty(k)) {
d[k] = this[k];
} else {
break;
}
}
d.executor = executor1;

d 就是一个从当前 d2js 实例复制出来但是数据源不同的 d2js 对象。

在 d2js 使用多种数据源如spring数据源的更多相关文章

  1. 【JAVA】Spring 数据源配置整理

            在Spring中,不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,此外,还可以通过代码的方式创建一个数据源,以便进行无依赖的单元测试. 配置数据源 ...

  2. Spring 数据源配置二:多数据源

    通过上一节  Spring 数据源配置一: 单一数据源  我们了解单一数据源的配置, 这里我们继续多个数据源的配置 如下(applicationContent.xml 内容) 一:  Spring   ...

  3. Spring 数据源

    1.使用org.springframework.jdbc.datasource.DriverManagerDataSource说明:DriverManagerDataSource建立连接是只要有连接就 ...

  4. spring+myBatis 配置多数据源,切换数据源

    注:本文来源于  tianzhiwuqis <spring+myBatis 配置多数据源,切换数据源> 一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样 ...

  5. 43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】

    [视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...

  6. Spring Boot 动态数据源(多数据源自己主动切换)

    本文实现案例场景: 某系统除了须要从自己的主要数据库上读取和管理数据外.另一部分业务涉及到其它多个数据库,要求能够在不论什么方法上能够灵活指定详细要操作的数据库. 为了在开发中以最简单的方法使用,本文 ...

  7. (43). Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】

    在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...

  8. Spring Boot 动态数据源(Spring 注解数据源)

    本文实现案例场景:某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基于 ...

  9. Spring Boot 动态数据源(多数据源自动切换)

    本文实现案例场景: 某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基 ...

  10. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

随机推荐

  1. 28. 找出字符串中第一个匹配项的下标 Golang实现

    题目描述: 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始).如果 needle 不是 hay ...

  2. kotlin集合——>集合概述、构造集合

    1.kotlin集合概述 在kotli.collections包中包含List(有序集合).Set(无序集合).Map(健值对)三种集合 2.val定义的集合,调用集合方法可以添加删除,但是如果重新创 ...

  3. for循环、break和continue、二重循环

    循环语句 循环语句可以反复多次执行同一组语句,for关键字可以用来编写循环:可以在for循环里让一个变量依次代表一组数字,然后使用同一组语句处理这个变量代表的每个数字.这个变量叫做循环变量,按照统一的 ...

  4. RabbitMQ3.8.16安装延迟队列插件

    安装过程 1:RabbitMQ 延迟插件GitHub 2:各版本地址 如我的MQ版本是3.8.16,那么根据提示下载的版本是: ①:移动插件到RabbitMQ的插件目录下,如我的位置是:/usr/li ...

  5. 蚂蚁图团队GraphRAG支持社区摘要——Token相比微软直降50%

    今年5月份,我们在DB-GPT v0.5.6版本发布了蚂蚁首个开源GraphRAG框架,支持了多种知识库索引底座,并在文章<Vector | Graph:蚂蚁首个开源GraphRAG框架设计解读 ...

  6. vscode连接docker时需要为docker容器开设一个映射端口

    相关: vscode远程连接远程主机上的docker -- 设置命令 -- -p 5001:5001 设置端口: -p 5001:5001 命令Demo: docker run -it -v /hom ...

  7. 4-11.3 C++中的显式类转换

    目录 static_cast 1.用来改变基本类型:一般是高精度转低精度 2.恢复void* 指针类型 const_cast 用来去除底层const(low-level const) reinterp ...

  8. Anaconda安装流程

    参考这篇博客,自己做一个记录而已anaconda安装 https://blog.csdn.net/Q_fairy/article/details/129158178

  9. 用Java实现samza转换成flink

    将Apache Samza作业迁移到Apache Flink作业是一个复杂的任务,因为这两个流处理框架有不同的API和架构.然而,我们可以将Samza作业的核心逻辑迁移到Flink,并尽量保持功能一致 ...

  10. 纪念第一次在 Github 上提 ISSUE 得到了老哥的回复

    背景 第一次在 GitHub 上提 ISSUE,提问的内容就是我的上一篇博文 rustlings v6.0 运行时出现 " You are trying to run Rustlings u ...