- 浏览: 284393 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (153)
- unix (2)
- sql (3)
- pl/sql (1)
- cvs (1)
- core java (36)
- OOAD UML (1)
- XML (4)
- JDBC (5)
- Hibernate (1)
- HTML (1)
- javascript (2)
- servlet (2)
- jsp (1)
- AJAX (1)
- Struts1.x (0)
- Struts2.x (5)
- Spring (6)
- EJB (2)
- WebService (2)
- 生活 (2)
- 感情 (0)
- 其他 (9)
- jbuilder2005 (1)
- db2 (1)
- groovy (1)
- 银行业务 (1)
- Android (9)
- java设计模式 (8)
- J2SE (2)
- DataBase (4)
- lucene (2)
- java卡 (1)
- flex (3)
- 烹饪 (1)
- 测试 (1)
- java硬件 (2)
- upnp (3)
- S2SH lib (1)
- nio CshBBrain (1)
- socket (1)
- 二维码 (1)
- 热加载 (1)
- hadoop (3)
- NIO (1)
- 新银行前置机预研 (1)
- springmvc3 (1)
- jvm (1)
- sf (0)
最新评论
-
niwowl:
可以!
gson使用在android使用例子 -
smallbee:
xin_jmail 写道首先感谢楼主的文章,让我知道了lock ...
java ReentrantLock Condition调试记录 -
xin_jmail:
首先感谢楼主的文章,让我知道了lock.newConditio ...
java ReentrantLock Condition调试记录 -
smallbee:
brad2309 写道lz 你的两个messageReceiv ...
基于Apache Mina实现的TCP长连接和短连接实例 -
brad2309:
lz 你的两个messageReceived方法是不是错乱了
基于Apache Mina实现的TCP长连接和短连接实例
情况:
因项目需要,需要使用动态数据源,什么叫动态数据源,就是数据源是由客户动态选择的,不仅仅有一个。这就意味在后台会配置多个数据源。
我们的系统有很多版本,不同版本开发在不同的数据库上,但是系统需要的一些配置依赖于数据库,所以需要有一个能配置数据源的后台,让开发人员自己处理。
解决方案:
数据库datasource,需要继承AbstractRoutingDataSource ,在spring包里面。
/** * <p> * Title: 动态获取数据源 * </p> * * <p> * Description: * </p> * * <p> * Copyright: 融博技术有限公司 2010 * </p> * * @author 袁泉锋HO174959 * @version 1.0 * @date Jul 23, 2010 * */ public class CustomerRoutingDataSource extends AbstractRoutingDataSource { /** * <Description>寻找当前线程数据库Key值 * * @since Jul 23, 2010 * @return <Description> * */ @Override protected Object determineCurrentLookupKey() { return CustomerContextHolder.getDataBase(); } }
AbstractRoutingDataSource 做了简单处理,我是反编译的,然后将属性targetDataSources修改为了map结构,key为数据源的ID,value是正常的datasource,看下面的spring配置文件:
package com.rb.util; import java.sql.Connection; import java.sql.SQLException; import java.util.*; import javax.sql.DataSource; import org.springframework.beans.factory.InitializingBean; import org.springframework.jdbc.datasource.AbstractDataSource; import org.springframework.jdbc.datasource.lookup.DataSourceLookup; import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup; import org.springframework.util.Assert; public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean { public AbstractRoutingDataSource() { dataSourceLookup = new JndiDataSourceLookup(); } public void setTargetDataSources(Map targetDataSources) { this.targetDataSources = targetDataSources; } public Map getTargetDataSources() { return this.targetDataSources; } public void setDefaultTargetDataSource(Object defaultTargetDataSource) { this.defaultTargetDataSource = defaultTargetDataSource; } public void setDataSourceLookup(DataSourceLookup dataSourceLookup) { this.dataSourceLookup = ((DataSourceLookup) (dataSourceLookup == null ? ((DataSourceLookup) (new JndiDataSourceLookup())) : dataSourceLookup)); } public void afterPropertiesSet() { if (targetDataSources == null) throw new IllegalArgumentException("targetDataSources is required"); resolvedDataSources = new HashMap(targetDataSources.size()); Object lookupKey; DataSource dataSource; for (Iterator it = targetDataSources.entrySet().iterator(); it .hasNext(); resolvedDataSources.put(lookupKey, dataSource)) { java.util.Map.Entry entry = (java.util.Map.Entry) it.next(); lookupKey = resolveSpecifiedLookupKey(entry.getKey()); dataSource = resolveSpecifiedDataSource(entry.getValue()); } if (defaultTargetDataSource != null) resolvedDefaultDataSource = resolveSpecifiedDataSource(defaultTargetDataSource); } protected DataSource resolveSpecifiedDataSource(Object dataSource) throws IllegalArgumentException { if (dataSource instanceof DataSource) return (DataSource) dataSource; if (dataSource instanceof String) return dataSourceLookup.getDataSource((String) dataSource); else throw new IllegalArgumentException( "Illegal data source value - only [javax.sql.DataSource] and String supported: " + dataSource); } public Connection getConnection() throws SQLException { return determineTargetDataSource().getConnection(); } public Connection getConnection(String username, String password) throws SQLException { return determineTargetDataSource().getConnection(username, password); } protected DataSource determineTargetDataSource() { Assert .notNull(resolvedDataSources, "DataSource router not initialized"); Object lookupKey = determineCurrentLookupKey(); DataSource dataSource = (DataSource) resolvedDataSources.get(lookupKey); if (dataSource == null) dataSource = resolvedDefaultDataSource; if (dataSource == null) throw new IllegalStateException( "Cannot determine target DataSource for lookup key [" + lookupKey + "]"); else return dataSource; } protected Object resolveSpecifiedLookupKey(Object lookupKey) { return lookupKey; } protected abstract Object determineCurrentLookupKey(); private Map targetDataSources; private Object defaultTargetDataSource; private DataSourceLookup dataSourceLookup; private Map resolvedDataSources; private DataSource resolvedDefaultDataSource; } /* DECOMPILATION REPORT Decompiled from: E:\myeclipse6.0_project\ToolServerFlex\WebRoot\WEB-INF\lib\spring.jar Total time: 218 ms Jad reported messages/errors: The class file version is 48.0 (only 45.3, 46.0 and 47.0 are supported) Exit status: 0 Caught exceptions: */
CustomerContextHolder如下:
/** * <p> * Title: 动态获取数据源 * </p> * * <p> * Description: * </p> * * <p> * Copyright: 融博技术有限公司 2010 * </p> * * @author 袁泉锋HO174959 * @version 1.0 * @date Jul 23, 2010 * */ public class CustomerContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDataBase(String dataBase) { contextHolder.set(dataBase); } public static String getDataBase() { return (String) contextHolder.get(); } public static void clearDataBase() { contextHolder.remove(); } }
开发人员请求过来的时候,调用方法setDataBase,将数据库配置key放入线程变量中。
自己定义一个数据库事务管理器:
package com.rb.util; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; public class TransactionManager { //private Connection conn; private DataSource dataSource; public static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public TransactionManager() { } // public synchronized Connection getConnection(){ // Connection conn = tl.get(); // if(conn==null){ // try { // conn = dataSource.getConnection(); // } catch (SQLException e) { // e.printStackTrace(); // } // tl.set(conn); // } // return conn; // } /** 开启事务 */ public void beginTransaction() throws SQLException{ try { Connection conn = tl.get(); if(conn==null){ conn = dataSource.getConnection(); tl.set(conn); } conn.setAutoCommit(false); //把事务提交方式改为手工提交 } catch (SQLException e) { throw new SQLException("开户事务时出现异常"); } } /** 提交事务并关闭连接 */ public void commitAndClose() throws SQLException{ Connection conn = null; try { conn = tl.get(); conn.commit(); //提交事务 } catch (SQLException e) { throw new SQLException("提交事务时出现异常"); }finally{ if(conn!=null){ conn.close(); } tl.remove(); //卸装线程绑定 } } /** 回滚并关闭连接 */ public void rollbackAndClose()throws SQLException{ Connection conn = null; try { conn = tl.get(); conn.rollback(); } catch (SQLException e) { throw new SQLException("回滚事务时出现异常"); } finally{ if(conn!=null){ conn.close(); } tl.remove(); //卸装线程绑定 } } }
调用完setDataBase方法之后,调用beginTransaction方法,第一次取的时候,connection是null,然后去datasource取连接,这个时候的datasource里面有很多数据源的连接,因为是一个map结构。当调用conn = dataSource.getConnection();的时候,会调用AbstractRoutingDataSource类的
方法:
public Connection getConnection() throws SQLException { return determineTargetDataSource().getConnection(); }
然后是:
protected DataSource determineTargetDataSource() { Assert .notNull(resolvedDataSources, "DataSource router not initialized"); Object lookupKey = determineCurrentLookupKey(); DataSource dataSource = (DataSource) resolvedDataSources.get(lookupKey); if (dataSource == null) dataSource = resolvedDefaultDataSource; if (dataSource == null) throw new IllegalStateException( "Cannot determine target DataSource for lookup key [" + lookupKey + "]"); else return dataSource; }
里面会用到方法:
Object lookupKey = determineCurrentLookupKey();
但是我们的子类重写了他,是去线程变量里面取刚才我们setDataBase进去的,所以只会取到一个datasource。
这样就能取到自己选择的数据库连接了。
评论
2 楼
smallbee
2011-08-04
sijuven 写道
您好,我想问一下,你们的数据源是有后台可以维护的,这些信息是如何在应用启动的时候加载 进来的呢,比如你现在运行过程中,我在后台添加了一条数据源信息。
不好意思,没有看到你提问。系统启动的时候,加载spring配置文件,所以都会放在bean里面,所以如果你要新增数据源,需要停止服务,然后更新配置文件,重新启动后台。
1 楼
sijuven
2011-07-12
您好,我想问一下,你们的数据源是有后台可以维护的,这些信息是如何在应用启动的时候加载 进来的呢,比如你现在运行过程中,我在后台添加了一条数据源信息。
发表评论
-
bike1
2015-12-07 17:10 0rt -
GPRS打印机的原理
2015-07-31 09:09 767一、什么是GPRS无线打印 ... -
关于 expression="execution(* com.xy.service.*.*(..))"
2015-05-21 09:22 2680先来看看这个spring的配 ... -
md5 sha1 java和javascript实现
2015-05-21 08:11 892<%@ page language="ja ... -
RSA帮助类
2014-11-21 09:36 966package com.cmb.fmserver.passp ... -
src2014-2-17
2014-02-17 21:55 0rt -
springmvc例子
2014-02-11 11:09 0rt -
qhdescjyw
2014-02-11 10:33 0rt -
按字节截取含有中文汉字的字符串
2013-05-07 18:55 3115要求实现一个按字节截取字符串的方法,比如对于字符串&quo ... -
SSL多线程安全问题
2013-04-23 15:44 1776项目原因,代码实现� ... -
wait notify 对象锁
2013-03-14 15:21 1166通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的 ... -
eclipse下配置hadoop环境
2012-12-05 11:44 1424按照http://smallbee.iteye.com ... -
centos虚拟机上安装运行hadoop(伪分布)
2012-11-15 15:28 19681、先在确认能否不输入口令就用ssh登录localhost: ... -
nio 远程主机强迫关闭了一个现有的连接 解决方案
2012-10-17 12:37 4616nio编程过程中会出现: Exception in thre ... -
java nio过程
2012-10-17 11:32 12451、服务端:ServerSocketChannel进行监听,注 ... -
socket 客户端连接池实现
2012-10-15 16:58 6730本文参考:http://cache.baidu.com/c?m ... -
java dom 解析xml例子
2012-08-02 14:09 1575XML格式如下: <?xml version=&quo ... -
DM5 java 例子
2012-08-02 10:38 1258package com.cmb.fbcbcserver; ... -
HTTP短连接模拟长连接 连接数不能超过2个
2012-08-01 15:47 2041项目中有用到服务器推技术,也是由于环境因素,银行系统,行内机房 ... -
java注解使用例子
2012-07-30 11:50 11881、注解定义: import java.lang.annot ...
相关推荐
内容概要:本文档详细介绍了基于 MATLAB 实现的 LSTM-AdaBoost 时间序列预测模型,涵盖项目背景、目标、挑战、特点、应用领域以及模型架构和代码示例。随着大数据和AI的发展,时间序列预测变得至关重要。传统方法如 ARIMA 在复杂非线性序列中表现欠佳,因此引入了 LSTM 来捕捉长期依赖性。但 LSTM 存在易陷局部最优、对噪声鲁棒性差的问题,故加入 AdaBoost 提高模型准确性和鲁棒性。两者结合能更好应对非线性和长期依赖的数据,提供更稳定的预测。项目还展示了如何在 MATLAB 中具体实现模型的各个环节。 适用人群:对时间序列预测感兴趣的开发者、研究人员及学生,特别是有一定 MATLAB 编程经验和熟悉深度学习或机器学习基础知识的人群。 使用场景及目标:①适用于金融市场价格预测、气象预报、工业生产故障检测等多种需要时间序列分析的场合;②帮助使用者理解并掌握将LSTM与AdaBoost结合的实现细节及其在提高预测精度和抗噪方面的优势。 其他说明:尽管该模型有诸多优点,但仍存在训练时间长、计算成本高等挑战。文中提及通过优化数据预处理、调整超参数等方式改进性能。同时给出了完整的MATLAB代码实现,便于学习与复现。
palkert_3ck_01_0918
pepeljugoski_01_1106
tatah_01_1107
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
题目:基于单片机的步进电机控制系统 模块: 主控:AT89C52RC 步进电机(ULN2003驱动) 按键(3个) 蓝牙(虚拟终端模拟) 功能: 1、可以通过蓝牙远程控制步进电机转动 2、可以通过按键实现手动与自动控制模式切换。 3、自动模式下,步进电机正转一圈,反转一圈,循环 4、手动模式下可以通过按键控制步进电机转动(顺时针和逆时针)
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
内容概要:本文详细介绍了建设智慧校园平台所需的六个关键步骤。首先通过需求分析深入了解并确定校方和使用者的具体需求;其次是规划设计阶段,依据所得需求制定全面的建设方案。再者是对现有系统的整合——系统集成,确保新旧平台之间的互操作性和数据一致性。培训支持帮助全校教职工和学生快速熟悉新平台,提高效率。实施试点确保系统逐步稳定部署。最后,强调持续改进的重要性,以适应技术和环境变化。通过这一系列有序的工作,可以使智慧校园建设更为科学高效,减少失败风险。 适用人群:教育领域的决策者和技术人员,包括负责信息化建设和运维的团队成员。 使用场景及目标:用于指导高校和其他各级各类学校规划和发展自身的数字校园生态链;目的是建立更加便捷高效的现代化管理模式和服务机制。 其他说明:智慧校园不仅仅是简单的IT设施升级或软件安装,它涉及到全校范围内的流程再造和创新改革。
该文档系统梳理了人工智能技术在商业场景中的落地路径,聚焦内容生产、电商运营、智能客服、数据分析等12个高潜力领域,提炼出100个可操作性变现模型。内容涵盖AI工具开发、API服务收费、垂直场景解决方案、数据增值服务等多元商业模式,每个思路均配备应用场景拆解、技术实现路径及收益测算框架。重点呈现低代码工具应用、现有平台流量复用、细分领域自动化改造三类轻量化启动方案,为创业者提供从技术选型到盈利闭环的全流程参考。
palkert_3ck_02_0719
克鲁格曼专业化指数,最初是由Krugman于1991年提出,用于反映地区间产业结构的差异,也被用来衡量两个地区间的专业化水平,因而又称地区间专业化指数。该指数的计算公式及其含义可以因应用背景和具体需求的不同而有所调整,但核心都是衡量地区间的产业结构差异或专业化程度。 指标 年份、城市、第一产业人数(first_industry1)、第二产业人数(second_industry1)、第三产业人数(third_industry1)、专业化指数(ksi)。
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
精品推荐,通信技术LTE干货资料合集,19份。 LTE PCI网络规划工具.xlsx LTE-S1切换占比专题优化分析报告.docx LTE_TDD问题定位指导书-吞吐量篇.docx LTE三大常见指标优化指导书.xlsx LTE互操作邻区配置核查原则.docx LTE信令流程详解指导书.docx LTE切换问题定位指导一(定位思路和问题现象).docx LTE劣化小区优化指导手册.docx LTE容量优化高负荷小区优化指导书.docx LTE小区搜索过程学习.docx LTE小区级与邻区级切换参数说明.docx LTE差小区处理思路和步骤.docx LTE干扰日常分析介绍.docx LTE异频同频切换.docx LTE弱覆盖问题分析与优化.docx LTE网优电话面试问题-应答技巧.docx LTE网络切换优化.docx LTE高负荷小区容量优化指导书.docx LTE高铁优化之多频组网优化提升“用户感知,网络价值”.docx
matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
pepeljugoski_01_0508
szczepanek_01_0308
oif2007.384.01_IEEE
stone_3ck_01_0119
oganessyan_01_1107