最近做项目要将读取到的数据同时插入到MySQL数据库和Oracle数据库当中,以前都是使用一个数据库,没有用过多数据源的情况,现在把这个问题搞定了,写下来希望对大家有点帮助,可能我所使用的方法不是最好的,希望多多指教。

首先是applicationContext.xml的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:component-scan base-package="com.ydcn.csv.dao"></context:component-scan>
<context:component-scan base-package="com.ydcn.csv.service"></context:component-scan>
<context:component-scan base-package="com.ydcn.csv.task"></context:component-scan>
<context:annotation-config></context:annotation-config> <!-- 管理MySQL的事务 -->
<tx:annotation-driven transaction-manager="mysqlTransactionManager" />
<!-- 管理Oracle的事务 -->
<tx:annotation-driven transaction-manager="oracleTransactionManager" /> <!-- MySQL的JNDI数据源 -->
<bean id="mysqlDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:MySQLTEST"></property>
</bean> <!-- MySQL的sessionFactory -->
<bean id="mysqlSessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="mysqlDataSource"></property>
<!-- 注解的方式定义实体类 -->
<property name="annotatedClasses">
<list>
<value>com.ydcn.csv.entity.MerchantCateOne</value>
<value>com.ydcn.csv.entity.MerchantCateTwo</value>
<value>com.ydcn.csv.entity.MerchantCateThree</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.jdbc.batch_size">50</prop>
<!-- <prop key="hibernate.show_sql">true</prop> -->
<!-- <prop key="hibernate.format_sql">true</prop> -->
</props>
</property>
</bean>
<!-- MySQL数据库事务管理 -->
<bean id="mysqlTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="mysqlSessionFactory"></property>
</bean> <!-- 为MySQL的实现类注入SessionFactory -->
<bean id="mysqlMechantCateOneDao" class="com.ydcn.csv.dao.mysql.impl.MysqlMechantCateOneDaoImpl">
<property name="sessionFactory" ref="mysqlSessionFactory"></property>
</bean> <!-- 为操作MySQL数据库的实现类注入SessionFactory -->
<bean id="mysqlMerchantCateTwoDao" class="com.ydcn.csv.dao.mysql.impl.MysqlMerchantCateTwoDaoImpl">
<property name="sessionFactory" ref="mysqlSessionFactory"></property>
</bean> <!-- 为操作MySQL数据库的实现类注入SessionFactory -->
<bean id="mysqlMerchantCateThreeDao"
class="com.ydcn.csv.dao.mysql.impl.MysqlMerchantCateThreeDaoImpl">
<property name="sessionFactory" ref="mysqlSessionFactory"></property>
</bean> <!-- ####################### 配置Oracle数据信息 ################### --> <!-- Oracle 的JNDI数据源 -->
<bean id="oracleDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:ORACLETEST"></property>
</bean> <!-- Oracle 的SessionFactory -->
<bean id="oracleSessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="oracleDataSource"></property>
<!-- 使用注解的方式定义实体类 -->
<property name="annotatedClasses">
<list>
<value>com.ydcn.csv.entity.TransCategoryData</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
<prop key="hibernate.jdbc.batch_size">50</prop>
<!-- <prop key="hibernate.show_sql">true</prop> -->
<!-- <prop key="hibernate.format_sql">true</prop> -->
</props>
</property>
</bean> <!-- Oracle事务管理配置 -->
<bean id="oracleTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="oracleSessionFactory"></property>
</bean> <!-- 为操作Oracle数据库的实现类注入SessionFactory -->
<bean id="oracleTransCategoryDataDao"
class="com.ydcn.csv.dao.oracle.impl.OracleTransCategoryDataDaoImpl">
<property name="sessionFactory" ref="oracleSessionFactory"></property>
</bean> <!-- #################################### 配置定时任务信息 ############################### -->
<!-- 读取 Transaction 和 Category CSV文件 -->
<bean id="readCSVTask" class="com.ydcn.csv.task.ReadCSVTask"></bean> <!-- 下载 CSV 文档 -->
<bean id="executeDownLoadCSVFileJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="readCSVTask"></property>
<property name="targetMethod" value="downLoadCSV"></property>
</bean>
<!-- 读取 CSV 文件 -->
<bean id="executeReadCSVFileJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="readCSVTask"></property>
<property name="targetMethod" value="readCSVFile"></property>
</bean> <!-- 定义下载CSV文档的时间 -->
<bean id="executeDownLoadCSVFileCron" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="executeDownLoadCSVFileJob"></property>
<property name="cronExpression" value="0 58 7 * * ?"></property>
</bean> <!-- 定义读取CSV文件的时间 -->
<bean id="executeReadCSVFileCron" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="executeReadCSVFileJob"></property>
<property name="cronExpression" value="0 0 8 * * ?"></property>
</bean> <!-- 总的管理类 将lazy-init="false" 那么容器启动的时候就会执行任务调度 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="executeDownLoadCSVFileCron"/>
<ref bean="executeReadCSVFileCron"/>
</list>
</property>
</bean> </beans>

我所使用的是泛型的方式去写:首先来看一下我的BaseDao吧!

package com.ydcn.csv.dao.base;

import java.util.List;

/**
* 基础的接口信息
* @author allen.tang
*
* @param <T>
*/
public interface BaseDao<T> { /**
* 保存实体的信息
* @param user
*/
public void save(T entity); /**
* 删除实体信息
* @param id
*/
public void delete(T entity); /**
* 更新实体信息
* @param user
*/
public void update(T entity); /**
* 根据id查询
* @param id
* @return
*/
public T queryById(int id); /**
* 查询出所有的信息
* @return
*/
public List<T> queryAll(); /**
* 根据特约商的代码查询出大类码的相关信息
* @param merchantGroupID
* @return
*/
public List<T> queryByMerchantGroupID(String merchantGroupID); }

这样所有的接口就可以继承这个BaseDao不用再一个一个的添加相同的方法,只要是相同的方法都可以写到BaseDao中,然后我们再来看看BaseDaoImpl

package com.ydcn.csv.dao.base;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /**
* 基础的接口实现
* @author allen.tang
*
* @param <T>
*/
public class BaseDaoImpl<T> extends HibernateDaoSupport { private Class<T> entityClass; /**
* 通过反射获取子类的确定的泛型类
*/
public BaseDaoImpl() {
// Type genType = this.getClass().getGenericSuperclass();
// Type[] params =
// ((ParameterizedType)getClass()).getActualTypeArguments();
// entityClass = (Class<T>) params[0];
this.entityClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
} public BaseDaoImpl(Class clazz) {
this.entityClass = clazz;
} // @Autowired
// @Qualifier("mysqlDataSource")
// public void anyMethodName(SessionFactory sessionFactory) {
// setSessionFactory(sessionFactory);
// } public Session getCurrentSession() {
return this.getHibernateTemplate().getSessionFactory()
.getCurrentSession();
} /**
* 根据ID加载PO实例
*
* @param id
* @return 返回相应的PO实例
*/
public T get(Serializable id) {
return this.getHibernateTemplate().get(entityClass, id);
} /**
* 保存PO
*
* @param entity
*/
public void save(T entity) {
this.getHibernateTemplate().save(entity);
} /**
* 删除PO
*
* @param entity
*/
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
} /**
* 修改PO
*
* @param entity
*/
public void update(T entity) {
this.getHibernateTemplate().update(entity);
} /**
* 执行hql查询
*
* @param hql
* hql查询语句
* @return 返回查询结果
*/
public List<T> find(String hql) {
return this.getHibernateTemplate().find(hql);
} /**
* 执行带参的hql查询
*
* @param hql
* hql查询语句
* @param params
* 参数
* @return 返回查询的集合
*/
public List<T> find(String hql, Object... params) {
return this.getHibernateTemplate().find(hql, params);
} /**
* 返回Query对象
*
* @param hql
* hql查询语句
* @param params
* 查询参数
* @return 返回的Query对象
*/
public Query createQuery(String hql, Object... params) {
Query query = this.getSession().createQuery(hql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
return query;
} /**
* 获取该类数据的总条数
*
* @return
*/
public int getCount() {
String hql = "select count(e) from " + entityClass.getSimpleName()
+ " e ";
Query query = this.createQuery(hql, null);
Long count = (Long) query.uniqueResult();
return count.intValue();
} /**
* 根据传入对象的编号获取对象的详细信息
*
* @param id
* 传入对象的id
* @return 返回正个对象
*/
public T queryById(int id) {
return this.get(id);
} /**
* 不进行分页的查询查询出所有的对象信息
*/
public List<T> queryAll() {
String hql = "from " + entityClass.getSimpleName();
List<T> list = find(hql);
return list;
} /**
* 根据特约商的代码查询出大类码的信息
*/
public List<T> queryByMerchantGroupID(String merchantGroupID) {
String hql = "from " + entityClass.getSimpleName() + " where merchantGroupID = ?";
List<T> list = find(hql, merchantGroupID);
return list;
} }

注释已经很详细了,这里我就不细说了,下面来看一下我的接口和实现类是怎么写的吧!

首先接口,只需要继承BaseDao,接口里就有了BaseDao的所有的方法,并加入了传入的类型

public interface TransCategoryDataDao extends BaseDao<TransCategoryData> {

}

然后实现类,这里使用注解的方式定义Dao层,之所以不仅继承了BaseDaoImpl类也实现了TransCateGoryDataDao接口是因为,有些方法可能是这个类独有的方法,需要这个类去单独实现,而不是放在公共的BaseDaoImp里面。

@Repository("oracleTransCategoryDataDao")
public class OracleTransCategoryDataDaoImpl extends BaseDaoImpl<TransCategoryData> implements TransCategoryDataDao{ }

然后其他的Service业务层的编写就和其他的项目的编写一样了。

可能考虑的有不全面的地方,希望各位高手多多指点

使用hibernate配置多数据源链接MySQL和Oracle数据库的更多相关文章

  1. ArcGIS 10.2 链接64位Oracle数据库

    https://my.oschina.net/zctzl/blog/909541 来自:https://blog.csdn.net/LoveCarpenter/article/details/5954 ...

  2. Spring+Hibernate配置多数据源

    配置说明 在实际应用中,经常会用到读写分离,这里就这种情况进行Spring+Hibernate的多数据源配置.此处的配置只是让读的方法操作一个数据库,写的方法操作另外一个数据库. 注:我这里的配置JD ...

  3. Hibernate 连接MySQL/SQLServer/Oracle数据库的hibernate.cfg.xml文件

    用Hibernate配置连接数据库可以方便我们对POJO的操作,节省了很多时间和代码.下面就分别说明连接不同数据库需要在hibernate.cfg.xml做的配置. 需要数据库驱动包可以点击这里下载: ...

  4. sql server中使用链接服务器访问oracle数据库

    一.  安装配置oracle客户端 要访问orcale数据,必须在访问的客户端机器上安装oracle客户端. Orcale有两种形式的客户端: l         完整的客户端 包括访问服务器端数据库 ...

  5. SQL Server 2014 64位版本链接32位Oracle数据库

    问题背景: 刚进入公司不久的BI新手,最近接部门的一个交接项目,需要在SQL Server上通过openquery来获取Oracle数据库的数据.各种配置,各种设置折腾了一周之久.在此,将自己的问题解 ...

  6. 使用Oracle SQL Developer迁移MySQL至Oracle数据库

    Oracle SQL Developer是Oracle官方出品的数据库管理工具.本文使用Oracle SQL Developer执行从MySQL迁移至Oracle数据库的操作. 2017年3月6日 操 ...

  7. Jsp 连接 mySQL、Oracle 数据库备忘(Windows平台)

    Jsp 环境目前最流行的是 Tomcat5.0.Tomcat5.0 自己包含一个 Web 服务器,如果是测试,就没必要把 Tomcat 与 IIS 或 Apache 集成起来.在 Tomcat 自带的 ...

  8. MySql和Oracle数据库区别

    Oracle与mysql区别: 1.Oracle有表空间,mysql没有表空间. 2.mysql的char类型取值范围0-255字节,varchar为0-65535字节 3.oracle的char类型 ...

  9. JDBC连接各种数据库的方法,连接MySql,Oracle数据库

    JDBC连接各种数据库的方法: JDBC编程步骤: 1.导入jar包 2.注册驱动 3.获取数据库连接对象 4.定义SQL语句 5.获得执行SQL语句对象statemnet 6.执行SQL语句 7.处 ...

随机推荐

  1. dbcp 是什么

    Many Apache projects support interaction with a relational database. Creating a new connection for e ...

  2. ebj笔记

    所有EJB3.0开发商都必须提供一个JMS provider的实现,JMS provider对于message-driven bean而言绝对是必须的.JMS是一套用于访问企业消息系统的开发商中立的A ...

  3. Add mappings to an Elasticsearch index in realtime

    Changing mapping on existing index is not an easy task. You may find the reason and possible solutio ...

  4. git 安装与使用场景

    1. 安装 yum install git #自动安装依赖 centos sudo apt-get install git #ubutu http://msysgit.github.io/ #wind ...

  5. 结构类模式(七):代理(Proxy)

    定义 为其他对象提供一种代理以控制对这个对象的访问. 代理模式也叫做委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应 ...

  6. 用CToolBarCtrl类为对话框创建工具栏

    ---恢复内容开始--- 首先CToolBarCtrl类内部维护了三个重要的数据结构:一个图像列表,一个字符串列表,一个TBBUTTON结构体的列表. 知道了这一点,下面的理解起来就轻松了.慢慢来: ...

  7. linxu php连接sqlserver

    今天linux的yum也不能用,用的是第三方的yum源,yum安装好后更新header又花了很长时间. 记得安装指定安装目录要用 --with-php-config=PATH命令. CentOS 6安 ...

  8. Linux基础教程之/dev/null和/dev/zero的区别及其用法

    在Linux操作系统中/dev/null和/dev/zero是两个相似却又很特殊的文件,特别是在shell脚本开发和系统运维过程中会经常用这两个文件,因此作为Linux系统工程师,必须了解这两个文件的 ...

  9. 用iframe设置代理解决ajax跨域请求问题

    面对ajax跨域请求的问题,想用代理的方式来解决这个跨域问题.在服务器端创建一个静态的代理页面,在客户端用iframe调用这个代理 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到aja ...

  10. CodeForces 164A Variable, or There and Back Again 搜索

    Variable, or There and Back Again 题目连接: http://codeforces.com/problemset/problem/164/A Description L ...