不少人误以为 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. 3. 王道OS-操作系统的运行机制,中断和异常

    1. 高级语言- 编译 - 机器指令 (二进制) 2. 内核态和用户态 :刚开机的时候CPU是内核态,当用户启动某个程序的时候CPU是用户态,如果遇到危险,操作系统会夺回CPU的控制权成为内核态,当危 ...

  2. WPF学习-布局

    1.  Grid布局 ,(Table 布局) 两行两列布局, Border  0 行 0 列默认开始 <Window x:Class="WpfApp.MainWindow" ...

  3. AI Undetect是什么?

    标题:AI UNDETECT:超越AI检测的反检测神器 在数字时代,人工智能的飞速发展已经渗透到我们生活的各个领域,包括教育.科技.网络内容制作等.越来越多的人依赖AI来生成各种内容,从学术作业.论文 ...

  4. Selenium实现元素定位

    Selenium提供了定位元素的方法find_element(),该方法被定义在WebDriver类中. 一.参数 1.两个参数,参数1根据不同定位方法确定,定位方法如下: (1)通过id定位:使用参 ...

  5. 整理程序员面试中HR最常问的问题

    前言 不要慌,不要怕,要调适好自己的情绪,在介绍自己的基本情况时面无表情,说的头头是道,必要的时候包装下自己,不属于你的功能也能说是你的(难不成会去查?查也查不到).不过在面试前,建议可以找自己的朋友 ...

  6. 批量登录软件,聚合登录,同时支持:小红书,快手,B站,视频号,淘宝光合,公众号一键运营管理,降本增效。

    在数字化时代,我们常常需要管理多个在线账号,这不仅增加了管理的复杂性,还可能导致效率的降低.为了帮助用户简化这一过程,我们推出了六款功能强大的聚合登录软件,涵盖了小红书.快手.B站.视频号.公众号和淘 ...

  7. 问题:深度学习时代的初期最为火热的AI安全问题已经很少有人讨论了,那么是不是已经解决该问题了呢?

    答案: 先说结果,该问题并没有被解决. 之所以该问题已经不是最初的那么火热的讨论和研究热点了,其主要原因是大家发现这个神经网络在深度学习时代是十分的work的,虽然AI安全问题一直没有解决,但是比较发 ...

  8. OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD

    前言   深入理解相机视口,摸索相机视口旋转功能,背景透明或者不透明.  本篇,实现了一个左下角旋转HUD且背景透明的相机视口.   Demo                  HUD相机的坐标    ...

  9. Xdebug+Phpstorm本地调试

    很久不用php进行开发, debug插件的安装与配置都忘完了, 看了下自己之前记录的一篇文章, 有点太乱了, 这里简约介绍下,方便后面快捷使用 XDebug下载地址: https://xdebug.o ...

  10. PHP之环境搭建(php7.4 + php8.1)

    之前写过几次,使用lnmp,宝塔,源码编译等方式来进行PHP环境的搭建, 随着接触的越来越多, 这里做一个总结, 常用的搭建方式 1.编译安装 之前写个几次,可以参考之前的 这次记录下多个版本PHP的 ...