- 浏览: 1613030 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (603)
- T_java (145)
- T_script&ASP (51)
- T_C/C++ (25)
- T_PowerBuilder (11)
- T_Database (53)
- T_odoo (7)
- T_应用服务器 (50)
- T_专_条形码 (6)
- T_专_负载均衡器 (4)
- T_操作系统 (94)
- T_信息安全 (41)
- T_专_搜索引擎 (14)
- T_L_PHP (58)
- T_L_Delphi (18)
- T_L_.NET、C#、VisualStudio (25)
- T_L_Objective-C (6)
- T_移动开发 (53)
- T_网络 (109)
- T_大数据 (2)
- T_嵌入式 (2)
- T_小众技术 (24)
- T_未分类 (58)
- L_旅游印记 (1)
- L_生活随笔 (48)
- L_中国文化 (18)
- L_户外与生存 (0)
最新评论
-
csbean4004:
不知道哪传来得恶习,发帖子不好好发,故意弄错一些东西,很讨厌
让HTML5支持后置摄像头 -
withthewind:
终于找到一个可以用的了。。。
如何用VBA取得Word文档中的标题前面的序号 -
busbby:
兄弟,无法下载,说文件不完整
一个好用的Outlook ost格式文件转pst文件的工具 -
yijavakevin:
密码啊~解压密码多少?
一个二维条形码组件 -
vipbooks:
你给的那个链接根本无法下载,跳到官网看了下最新版12M,但点下 ...
十步以内完成精细web打印
最近在试用wabacus,遇到一个问题:一个应用需要连接多个数据,除了一个主数据库以外,其他数据库连接参数只能在运行时才能从主数据库取得并进行动态创建数据。 wabacus本身是支持多数据库的,但不支持在运行期动态创建数据源。通过咨询wabacus作者以及研究wabacus的源码,想出了一种实现办法。在这里把实现方法记录一下,方便自己也方便别人。
=========================================================
思路:
1、搞清框架中创建数据源的思路;
2、想办法模仿并创建数据源,并把创建好的数据源放入框架数据源集合;
实现:
在作者老大指点下,了解了框架中创建数据源并入数据源集合的入口:
com.wabacus.config.ConfigLoadManager 中
loadDataSources 方法的下面几句:
((AbsDataSource)providerObj).setName(name);
//
((AbsDataSource)providerObj).loadConfig(eleDataSource);
//根据配置信息创建数据源
mDataSources.put(name,((AbsDataSource)providerObj));
//把数据源放入框架数据源集合
……
Config.getInstance().setMDataSources(mDataSources);
搞明白这个,剩下的事情就不难了,整个实现比预期的要简单很多。作一个工具类来实现新增自定义数据源:
//CustomConfigUtil.java
/** * @CopyRright (c)2011: BrokenStone * @Project: csbhxt * @File: CustomeConfigUtil.java * @JDK version used: JDK1.6 @ * @Author: BrokenStone * @Blog: http://sheng.javaeye.com) * @Email: wdmsyf@yahoo.com * @since: 2012-5-13 * @Ver: 1.0 */ package com.iteye.sheng.wabacus.extend.config; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.DocumentFactory; import org.dom4j.Element; import com.wabacus.config.Config; import com.wabacus.config.database.datasource.AbsDataSource; import com.wabacus.config.database.datasource.DriverManagerDataSource; import com.wabacus.exception.WabacusConfigLoadingException; /** * wabacus框架配置参数增强工具类 */ public class CustomConfigUtil { private static final Log log = LogFactory.getLog(CustomConfigUtil.class); /** * 增加自定义数据源 * @param eleDataSource 数据源配置参数的Element */ public static void addCustomeDataSource(Element eleDataSource) { Map<String, AbsDataSource> mDataSources = Config.getInstance().getMDataSources(); String name = eleDataSource.attributeValue("name"); if (StringUtils.isEmpty(name)) { throw new WabacusConfigLoadingException("必须配置数据源的name属性"); } name = name.trim(); if (mDataSources.containsKey(name)) { throw new WabacusConfigLoadingException("配置的数据源:" + name + "存在重复"); } String provider = eleDataSource.attributeValue("type"); if (provider == null || provider.trim().equals("")) { provider = DriverManagerDataSource.class.getName(); } Object providerObj = null; try { Class c_provider = Class.forName(provider); providerObj = c_provider.newInstance(); } catch (ClassNotFoundException e1) { throw new WabacusConfigLoadingException("无法加载数据源类:" + provider, e1); } catch (Exception e) { throw new WabacusConfigLoadingException("数据源类:" + provider + "无法实例化", e); } if (!(providerObj instanceof AbsDataSource)) { throw new WabacusConfigLoadingException("配置的数据源类:" + provider + "没有继承超类" + AbsDataSource.class.getName()); } ((AbsDataSource) providerObj).setName(name); ((AbsDataSource) providerObj).loadConfig(eleDataSource); mDataSources.put(name, ((AbsDataSource) providerObj)); } /** * 增加自定义数据源 * @param params */ public static void addCustomeDataSource(Map<String, String> params){ DocumentFactory df = new DocumentFactory(); Element newDSElement = df.createElement("datasource"); newDSElement.addAttribute("name", params.get("name")); newDSElement.addAttribute("type", params.get("type")); newDSElement.addAttribute("dbtype", params.get("dbtype")); ((newDSElement.addElement("property")).addAttribute("name", "driver")).setText( getParam(params, "driver") ); ((newDSElement.addElement("property")).addAttribute("name", "url")).setText( getParam(params, "url") ); ((newDSElement.addElement("property")).addAttribute("name", "user")).setText( getParam(params, "user") ); ((newDSElement.addElement("property")).addAttribute("name", "password")).setText( getParam(params, "password", "") ); ((newDSElement.addElement("property")).addAttribute("name", "max_size")).setText( getParam(params, "max_size", "20") ); ((newDSElement.addElement("property")).addAttribute("name", "min_size")).setText( getParam(params, "min_size", "5") ); ((newDSElement.addElement("property")).addAttribute("name", "timeout")).setText( getParam(params, "timeout", "100")); ((newDSElement.addElement("property")).addAttribute("name", "max_statements")).setText( getParam(params, "max_statements", "100")); ((newDSElement.addElement("property")).addAttribute("name", "idle_test_period")).setText( getParam(params, "idle_test_period", "50")); ((newDSElement.addElement("property")).addAttribute("name", "acquire_increment")).setText( getParam(params, "acquire_increment", "2")); addCustomeDataSource(newDSElement); } private static String getParam(Map<String, String> params, String name){ return params.get(name); } private static String getParam(Map<String, String> params, String name, String defaultValue){ return StringUtils.isEmpty(params.get(name))? defaultValue : params.get(name); } }
使用例子如下:
private void addCustomeDataSourceTest(){ Map<String, String> dsParamMap = new HashMap<String, String>(); dsParamMap.put("name", "MyCustomDS1"); dsParamMap.put("type", "com.wabacus.config.database.datasource.C3P0DataSource"); dsParamMap.put("dbtype", "com.wabacus.config.database.type.MySql"); dsParamMap.put("driver", "com.mysql.jdbc.Driver"); dsParamMap.put("url", "jdbc:mysql://localhost:3306/phonegap?useUnicode=true&characterEncoding=UTF-8"); dsParamMap.put("user", "root"); dsParamMap.put("password", ""); dsParamMap.put("max_size", "20"); dsParamMap.put("min_size", "5"); dsParamMap.put("timeout", "100"); dsParamMap.put("max_statements", "100"); dsParamMap.put("idle_test_period", "50"); dsParamMap.put("acquire_increment", "2"); CustomConfigUtil.addCustomeDataSource( dsParamMap ); AbsDataSource ds = Config.getInstance().getDataSource("MyCustomDS1"); Connection conn = ds.getConnection(); Statement stmt = null; ResultSet rs = null; try{ stmt = conn.createStatement(); boolean isSucc = stmt.execute("SELECT * FROM employee"); if(isSucc){ rs = stmt.getResultSet(); StringBuffer sb = new StringBuffer(""); while(rs.next()){ sb.append("id = ").append(rs.getInt("id")).append(", ") .append("firstName = ").append(rs.getString("firstName")).append(", ") .append("lastName = ").append(rs.getString("lastName")).append(", ") .append("managerId = ").append(rs.getString("managerId")).append(", ") .append("title = ").append(rs.getString("title")).append(", ") .append("department = ").append(rs.getString("department")).append(", ") .append("officePhone = ").append(rs.getString("officePhone")).append(", ") .append("cellPhone = ").append(rs.getString("cellPhone")).append(", ") .append("email = ").append(rs.getString("email")).append(", ") .append("city = ").append(rs.getString("city")).append(", ") .append("picture = ").append(rs.getString("picture")).append("\r\n "); } log.debug(sb.toString()); System.out.println(sb.toString()); }else{ log.error("执行SQL语句失败。"); } }catch(SQLException ex){ log.error(ex); }finally{ try{ if(rs!=null) rs.close(); rs = null; }catch(SQLException ex){ log.warn(ex); } try{ if(stmt!=null) stmt.close(); stmt = null; }catch(SQLException ex){ log.warn(ex); } try{ if(conn!=null) conn.close(); conn = null; }catch(SQLException ex){ log.warn(ex); } } }
再次感谢作者提供如此优秀的开发框架并给予无私指导。
发表评论
-
SpringBoot Fat Jar解压运行
2018-06-28 21:40 2263SpringBoot已经成为当前最流行的微服务 ... -
一句话实现五星评分显示
2018-06-05 08:31 999Python: rate = 1 #rate 取值 ... -
TeamViewer13+Patch
2018-05-13 22:19 3204下载地址: https://www.datafilehos ... -
来算google的可视化编程工具——Blockly,不仅仅是玩具
2017-10-16 21:34 33162Blockly - 来自Google的可 ... -
Linux挂载阿里云对象存储OSS作为本地磁盘扩充空间备份网站
2017-09-25 08:54 1942p.s.挂载oss之后,使用rsync可以同步图片数据,非 ... -
安卓动态分析工具 Inspeckage
2017-08-07 08:46 0工具介绍 一个基于Xposed 开发的应用动态分析工具 g ... -
Android逆向之旅---静态方式破解微信获取聊天记录和通讯录信息
2017-08-07 08:37 0一、猜想数据存放路径 微信现在是老少皆宜,大街小巷都在使用 ... -
破解微信数据库 并查询数据上传服务器
2017-08-07 08:29 0由于工作需求破解了微信的数据库 并获取想要的信息上传服 ... -
安卓黑科技之HOOK详解
2017-08-07 08:21 0本文带大家进入到安卓另一个世界 互联网攻防大战 Xpos ... -
安卓逆向之基于Xposed-ZjDroid脱壳
2017-08-07 08:18 0前言 之前介绍了普通常见的反编译模式 但对于使用了 360 ... -
Chrome核心的自定义浏览器
2017-07-04 17:19 831以Chrome为核心的自定义浏览器源代码,有时候可能用得到,保 ... -
十步以内完成精细web打印
2017-06-21 11:44 7390注意: 康虎云报表组 ... -
浏览器端精准打印或套打组件
2017-01-18 13:05 6705注意: 康虎云报表 ... -
让ie6 7 8 9支持html5 websocket
2016-12-23 20:52 2324结果: 从github上的 web ... -
网站获取用户手机号码的方法、系统、客户端及服务器(坑爹的玩意儿)
2016-11-22 14:22 2291网站获取用户 ... -
Ubuntu16.04上安装MT7601网卡驱动(TL-W725N/W725N)
2016-09-15 23:01 0I suggest you get a temporary ... -
如何在palcedoler中放置图标
2016-09-10 09:52 646如何在H5的palceholder中设置一个图标? ... -
疯狂软件对Oracle放弃Java EE的看法
2016-08-14 22:38 530来源:http://javaligang ... -
一个下载youtube视频的Linux工具
2016-07-01 08:50 952我们要介绍工具是youtube-dl。这是一个跨平台的工具, ... -
另一个穿透内网的工具(类似ngrok)
2016-06-20 20:26 4844前段时间介绍过两种把内网端口映射到公网的工具:ngrok ...
相关推荐
1. **CGLIB**:全称为Code Generation Library,是一个Java字节码处理库,用于在运行期动态创建类或增强已有类的功能。在Spring AOP(面向切面编程)中,当目标对象没有实现接口时,Spring会使用CGLIB来创建代理对象...
而CGLIB(Code Generation Library)是在运行期通过字节码技术动态生成子类来实现代理,即使目标对象没有实现接口也能进行代理。CGLIB在Spring框架中被广泛用于那些没有实现接口的类的代理。 Spring整合Mybatis是另...
1. **动态网页概念**:动态网页指的是在服务器端运行的程序或网页,它们能够根据不同的客户端请求、不同的时间点返回不同的内容,从而实现更为丰富的交互效果。 2. **URL组成部分**: - **协议**:如HTTP(超文本...
- AOP:在不修改源代码的情况下,通过预编译方式或运行期动态代理实现程序功能的统一维护的一种技术,常用于日志、事务等。 - SOC:一个类应该只有一个引起变化的原因,每个类应有一个单一的职责,提高可维护性。 ...
- **连接管理**:在微服务架构下,由于服务数量较多,每个服务都需要与多个数据库建立连接,因此必须有效管理数据库连接池,以避免资源浪费和性能瓶颈。 **2.4 最终一致性组件** - **组件功能**:为了处理分布式...
动态装配是指在运行时动态加载和配置门户组件的能力,而过程集成则是指与其他企业应用程序和服务之间的集成。 1. **动态组件加载**:支持按需加载门户组件,减少启动时间和内存占用。 2. **工作流集成**:实现与...
DBCP 是基于Jakarta commons-pool的数据库连接池实现,它可以高效地复用数据库连接,避免频繁创建和销毁连接所带来的开销。在实际应用中,特别是在高并发环境下,使用DBCP可以显著提升系统的性能和稳定性。 #### 10...
7.4.4 创建数据源 7.4.5 编写客户程序 7.4.6 三层软件应用模型 小结 第8章 OLE文档与ActiveX文档 8.1 OLE文档基础知识 8.1.1 OLE文档服务器与包容器 8.1.2 OLE服务体系结构 8.1.3 链接与嵌入技术 8.1.4 现场激活...
3. ** cglib-nodep-2.1_3.jar**:CGLIB是一个高性能的代码生成库,用于在运行期扩展Java类与实现Java接口。Hibernate在没有JDK代理支持的情况下使用CGLIB来创建实体类的代理对象,以便于实现懒加载和其他高级特性。 ...
- **Subject**:作为Observable和Observer的桥梁,允许多个观察者订阅同一个数据源。 - **Schedulers**:RxJava中的调度器,用于控制操作符的执行顺序和执行位置。 **6.3 事件变换设计** - **操作符**:RxJava提供...
- **配置数据源**:在 Spring 中配置数据库连接池,如 DBCP。 - **注入使用**:在服务层或 DAO 层注入 DataSource。 - **DBCP 特点**:了解 DBCP 的特点及其使用场景。 #### 第十课:Spring 整合 Hibernate - **...
1. **freemarker-2.3.15.jar**:FreeMarker是一个用于生成输出文本的模板引擎,它可以与任何能够输出纯文本的数据源一起工作。在Struts2框架中,主要用于处理页面模板(例如JSP页面模板),使得开发者能够更方便地...
10.2.4 数据源对象 301 10.2.5 数据绑定 308 10.2.6 更新数据 316 10.3 在服务器和客户之间传输数据 319 10.3.1 基于服务器的组件 319 10.3.2 DataSpace对象 320 10.3.3 使用服务器端组件的优点 322 10.3.4 ...
10.2.4 数据源对象 301 10.2.5 数据绑定 308 10.2.6 更新数据 316 10.3 在服务器和客户之间传输数据 319 10.3.1 基于服务器的组件 319 10.3.2 DataSpace对象 320 10.3.3 使用服务器端组件的优点 322 10.3.4 ...