不少人误以为 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. forEach filter some map every 的区别

    forEach 遍历数组,不会改变原数组,没有返回值 : filter 过滤数组 相同点:都不改变原数组,都是数组的实例方法 :

  2. Failed to mount component: template or render function not defined 使用 require 引入组件的时候报错

    为什么有的时候使用require引入组件不会报错,有的时候就会报错,需要加上default就不会报错  ? webpack 支持 CommonJS和 ES6模块打包,当我们引用组件的时候,在 scri ...

  3. Nuxt.js 应用中的 restart 事件钩子详解

    title: Nuxt.js 应用中的 restart 事件钩子详解 date: 2024/10/14 updated: 2024/10/14 author: cmdragon excerpt: re ...

  4. KubeSphere 社区双周报 | OpenFunction 支持 Dapr 状态管理 | 2023.03.31-04.13

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  5. Nginx 反向代理 (泛域名->泛域名,https,静态文件)

    Nginx 反向代理配置指南 (泛域名 -> 泛域名, HTTPS, 静态文件) 完整版 server { # 监听80端口 listen 80; listen 443 ssl http2;; ...

  6. 需求解决 _按需要对控件进行禁用和解除禁用 _CSS _20210922

    需求解决 _按需要对控件进行禁用和解除禁用 _CSS _20210922 通过JQuery 或者其他方式的选择器 获取DOM节点 再通过一下的方式 设置 disabled属性为 true 即可禁用,为 ...

  7. 体验国产系统Deepin:很爽

    最近开始把之前一直吃亏的旧电脑拿出来再利用了,先还是选择了熟悉的ubuntu系列.安装了Ubuntu 22.04之后,风风火火地把需要的开发环境搭建起来,虽然桌面有些卡顿,但瑕不掩瑜玉.趁着热情又想着 ...

  8. Shell之根据关键字符串替换文件中的行

    KEY="所要搜索的关键字符串"FullPath=所要搜索的文件的路径str="要替换行的字符串"     根据关键字符串定位行号:line=`sed -n ' ...

  9. 重温c语言之,7天开整,就是随便的写写,第三天+第四天版

    一:指针 1.关于指针的含义---粗略 例如:int a=10; int* p=&a; 这里的*,是说明p是指针变量,int 说明p是指向的对象是int类型的 *p=20, 这里的*是解引用符 ...

  10. MongoDB面试专题33道解析

    大家好,我是 V 哥.今天给大家分享 MongoDB的道 V 哥整理的面试题,收藏起来,一定会对你有帮助. 1. 你说的 NoSQL 数据库是什么意思?NoSQL 与 RDBMS 直接有什么区别?为什 ...