不少人误以为 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. /proc/pagetypeinfo

    这个文件是将buddyinfo的内容进一步细分: Free pages count per migrate type at order -- 不同order 按照migrate type的空闲page ...

  2. 05-react的类组件和函数组件 -- 状态 state

    // 函数组件是无状态的 既没有数据的 类似 vue 组件中的 data 数据 // 类组件是有状态的组件 是有数据的 是双向绑定的数据 是数据驱动视图的 负责UI的视图更新 (单个组件的私有数据组件 ...

  3. 71.登录失效,token过期怎么处理

    1. 清除用户数据,直接跳转登录页重新登录 : 2. 短token 过期,使用 长 token 重新获取短 token ,然后重新请求 : 如果长 token 也过期了,就去重新登录获取 token ...

  4. CSP-J2/S2 2023 游记

    可能早就应该发出来的游记. 2023-10-07 16:32. 前一天睡得比较晚,所以迟到了一点点. 上来先敲了个对拍,拍了一个 if a % 1000 = 0 then a++ 的 A + B,拍出 ...

  5. RocketMQ 全链路灰度探索与实践

    本文作者:肖京,Spring Cloud Alibaba PMC,阿里云智能技术专家. 01 全链路灰度背景介绍 发布新版本时,为了有效.谨慎地验证新版本代码逻辑的正确性,通常会采用灰度发布,从而达到 ...

  6. AI五子棋_06 坐标表示到图形表示的算法 Python实现

    AI五子棋 第六步 恭喜你到达第六步! 你已经成功实现了公钥体系最为关键的部分.现在服务器相信你就是你了,下面开始你的战斗. 五子棋的棋盘有15×15个交点,一共有225个交点,我们可以在每一个交点上 ...

  7. idea项目提交到码云

    第一步:创建一个项目 第二步:在码云上新建一个项目.[注意把使用Readme复选框取消掉] 第三步:复制gitee地址 第四步:创建本地git仓库 第五步:选择自己需要上传到码云的项目名 第六步:提交 ...

  8. 强化学习:如何计算被环境系统截断的terminated state的value值 —— (Bootstrap returns from value estimates if episode is terminated by timeout)

    本文主题:如何计算强化学习中被环境系统截断的terminated state的value值 首先解释一下什么是强化学习中的terminated state的value值,强化学习就是一个智能体(age ...

  9. docker REPOSITORY 改名

    创建新的名称: docker tag oldname:tag newname:tag 删除旧的名称: docker rmi oldname:tag

  10. BIMFCE选择全量绘制

    var webAppConfig = new Glodon.Bimface.Application.WebApplication3DConfig(); webAppConfig.domElement ...