- 浏览: 1581124 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (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 2190SpringBoot已经成为当前最流行的微服务 ... -
一句话实现五星评分显示
2018-06-05 08:31 951Python: rate = 1 #rate 取值 ... -
TeamViewer13+Patch
2018-05-13 22:19 3143下载地址: https://www.datafilehos ... -
来算google的可视化编程工具——Blockly,不仅仅是玩具
2017-10-16 21:34 32772Blockly - 来自Google的可 ... -
Linux挂载阿里云对象存储OSS作为本地磁盘扩充空间备份网站
2017-09-25 08:54 1854p.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 795以Chrome为核心的自定义浏览器源代码,有时候可能用得到,保 ... -
十步以内完成精细web打印
2017-06-21 11:44 7295注意: 康虎云报表组 ... -
浏览器端精准打印或套打组件
2017-01-18 13:05 6645注意: 康虎云报表 ... -
让ie6 7 8 9支持html5 websocket
2016-12-23 20:52 2207结果: 从github上的 web ... -
网站获取用户手机号码的方法、系统、客户端及服务器(坑爹的玩意儿)
2016-11-22 14:22 2196网站获取用户 ... -
Ubuntu16.04上安装MT7601网卡驱动(TL-W725N/W725N)
2016-09-15 23:01 0I suggest you get a temporary ... -
如何在palcedoler中放置图标
2016-09-10 09:52 603如何在H5的palceholder中设置一个图标? ... -
疯狂软件对Oracle放弃Java EE的看法
2016-08-14 22:38 483来源:http://javaligang ... -
一个下载youtube视频的Linux工具
2016-07-01 08:50 872我们要介绍工具是youtube-dl。这是一个跨平台的工具, ... -
另一个穿透内网的工具(类似ngrok)
2016-06-20 20:26 4751前段时间介绍过两种把内网端口映射到公网的工具:ngrok ...
相关推荐
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 现场激活...
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 ...