最近项目中有一种需求:  大致需求是这样的 通过给定的  用户名和密码 要定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表

项目的结构式struts1   hibernate   spring 

这里使用spring的定时来处理,自己写了个项目进行测试,目前项目可以跑的通,

在测试当中遇到了问题,就是使用 spring 提供的jdbcTemplate进行操作数据,使用的是dbcp数据源,可以查询到数据,但是inert update  delete  操作数据时,看起来成功了,但是数据库中的数据并没有变化,

查了很多的资料,偶然发现 有人说  dbcp数据源的事务不是自动提交,所以看不到效果,
改用c3p0数据源之后,的确是好了
后来发现在使用dbcp数据源时 把事务的自动提交功能给关闭了
<property name="defaultAutoCommit">
<value>false</value> 定时任务的核心代码开始
项目的组织结构

            < 1 >

          < 2 >

任务类有1个:JobClass.java
该类的任务就是从定时从sqlserver中取出数据,然后更新oracle中数据
JobClass.java
package com.sinovatech.news.datatransjob; import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate; import com.sinovatech.news.model.dto.CmsCyUser; public class JobClass{ private JdbcTemplate jdbcTemplate_oracle;
private JdbcTemplate jdbcTemplate_sqlserver; /**
* 1. 定时操作:定时从sqlserver中取数据,更新数据库
* 2. 方法以TX结尾时 使用事务的一个条件 ,
* spring中的bean要使用下面的配置方法
* <bean id="jobClass" parent="baseTransactionProxy">
<property name="target">
<bean class="com.sinovatech.news.datatransjob.JobClass">
<property name="jdbcTemplate_oracle">
<ref bean="jdbcTemplate_oracle"/>
</property>
<property name="jdbcTemplate_sqlserver">
<ref bean="jdbcTemplate_sqlserver"/>
</property>
</bean>
</property>
</bean>
*/
public void myJobTX() {
List<CmsCyUser> cmsCyUsers = getData();
updateTicketInfo(cmsCyUsers);
} /**
* 更新oracle中CMS_CY_USER表的数据,
* 使用BatchPreparedStatementSetter进行批处理
* @param users
*/
public void updateTicketInfo(List<CmsCyUser> users) {
if(users==null||users.size()==0){
return;
}
final List<CmsCyUser> cyUsers = users;
String sql = "update CMS_CY_USER set tickets=? where race_num=?";
jdbcTemplate_oracle.batchUpdate(sql,
new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i)
throws SQLException {
CmsCyUser user = cyUsers.get(i);
ps.setInt(1, user.getTickets().intValue());
ps.setString(2, user.getRaceNum());
} public int getBatchSize() {
return cyUsers.size();
}
});
resetTickets(users,jdbcTemplate_oracle);
} /**
* 把没有race_num对应的tickets数据清零
* @param users
* @param jdbcTemplateOracle
*/
private void resetTickets(List<CmsCyUser> users,JdbcTemplate jdbcTemplateOracle) {
if(users==null||jdbcTemplateOracle==null){
return;
}
StringBuffer buffer = new StringBuffer();
buffer.append("(");
for(int i=0;i<users.size()-1;i++ ){
buffer.append("'"+users.get(i).getRaceNum()+"',");
}
buffer.append("'"+users.get(users.size()-1).getRaceNum()+"')");
String sql = "update CMS_CY_USER set tickets=0 where race_num not in "+buffer.toString();
jdbcTemplateOracle.update(sql);
} /**
* 从sqlserver中取出数据
* @return
*/
public List<CmsCyUser> getData() {
List<CmsCyUser> userList = new ArrayList<CmsCyUser>();
List list = null;
String sql = "SELECT race_num,tickets FROM ticketinfo";
list = jdbcTemplate_sqlserver.queryForList(sql);
if (!list.isEmpty() && list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
Object obj = list.get(i);
String[] ticketInfos = obj.toString().split(",");
// 因为只有2个值,所以直接使用下标来处理
String raceNum = ticketInfos[0].replaceAll("\\s*", "");
// 过滤掉含有中文的非法编号
if (isContainsChinese(raceNum)) {
continue;
}
String tickets = ticketInfos[1];
int b2 = tickets.indexOf('}');
int b1 = tickets.indexOf('=');
int a = raceNum.indexOf('=');
CmsCyUser user = new CmsCyUser();
raceNum = raceNum.substring(a + 1);
tickets = tickets.substring(b1 + 1, b2);
user.setRaceNum(raceNum);
user.setTickets(Long.parseLong(tickets));
userList.add(user);
}
}
System.out.println("..successful..");
return userList;
} /**
* 判断字符串中是否含有中文字符
* @param str
* @return
*/
public boolean isContainsChinese(String str) {
Matcher matcher = Pattern.compile("[\u4e00-\u9fa5]").matcher(str);
boolean flg = false;
if (matcher.find()) {
flg = true;
}
return flg;
} public JdbcTemplate getJdbcTemplate_sqlserver() {
return jdbcTemplate_sqlserver;
} public void setJdbcTemplate_sqlserver(JdbcTemplate jdbcTemplateSqlserver) {
jdbcTemplate_sqlserver = jdbcTemplateSqlserver;
} public JdbcTemplate getJdbcTemplate_oracle() {
return jdbcTemplate_oracle;
} public void setJdbcTemplate_oracle(JdbcTemplate jdbcTemplateOracle) {
jdbcTemplate_oracle = jdbcTemplateOracle;
}
}

调用任务的类

MyJob.java

package com.sinovatech.news.datatransjob;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* spring 定时任务
* #####spring 定时任务需要继承QuartzJobBean 这种方式是最常用的!
* #####同时就实现了抽象方法executeInternal
*
*/
public class MyJOb extends QuartzJobBean{ private JobClass jobClass; public void setJobClass(JobClass jobClass) {
this.jobClass = jobClass;
} /**
* 调用自定义的任务
*/
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
jobClass.myJobTX();
}
}

Spring的相关的配置信息

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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<!—定义oracle的连接 此处使用dbcp数据源-->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<property name="maxActive">
<value>100</value>
</property>
<property name="maxIdle">
<value>3</value>
</property>
<property name="maxWait">
<value>-1</value>
</property>
<!-- 个人认为此处最后开启数据源事务自动提交功能-->
<property name="defaultAutoCommit">
<value>true</value>
</property>
</bean>
<!—定义oracle的SessionFactory-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="lobHandler">
<ref bean="oracleLobHandler" />
</property>
<property name="dataSource">
<ref local="dataSource" />
</property> <property name="mappingDirectoryLocations">
<list>
<value>classpath:/hbm</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9iDialect
</prop>
<prop key="hibernate.jdbc.batch_size">0</prop> <prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean> <!-- ****************************** 新增sqlserver的数据源和 sessionFactory的配置 begin *************************************************--> <!—sqlserver 的连接,使用dbcp 数据源-->
<bean id="dataSource_sqlserver"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${sqlserver.driver}</value>
</property>
<property name="url">
<value>${sqlserver.url}</value>
</property>
<property name="username">
<value>${sqlserver.username}</value>
</property>
<property name="password">
<value>${sqlserver.password}</value>
</property>
<property name="maxActive">
<value>100</value>
</property>
<property name="maxIdle">
<value>3</value>
</property>
<property name="maxWait">
<value>-1</value>
</property>
<!-- 个人认为此处最后开启数据源事务自动提交功能-->
<property name="defaultAutoCommit">
<value>true</value>
</property>
</bean> <bean id="sessionFactory_sqlserver" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource_sqlserver" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.connection.autocommit">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
</bean>
<!-- ****************************** 新增sqlserver的数据源和 sessionFactory的配置 end *************************************************-->
<!—定义事务处理-->
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*RTX">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*TX">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!—定义oracle的事务管理 ,该事务处理的bean会被引用-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!--*********************************** 定时任务相关配置 begin ***********************************--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean> <bean id="jdbcTemplate_oracle" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean> <bean id="jdbcTemplate_sqlserver" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource_sqlserver"/>
</bean> <!-- 把数据写入oracle,此处使用了事务管理 -->
<bean id="jobClass" parent="baseTransactionProxy">
<property name="target">
<bean class="com.sinovatech.news.datatransjob.JobClass">
<property name="jdbcTemplate_oracle">
<ref bean="jdbcTemplate_oracle"/>
</property>
<property name="jdbcTemplate_sqlserver">
<ref bean="jdbcTemplate_sqlserver"/>
</property>
</bean>
</property>
</bean> <!-- 基础的配置 相关类的注入 -->
<bean class="org.springframework.scheduling.quartz.JobDetailBean" id="MyTimeSpringJob">
<property name="jobClass" value="com.sinovatech.news.datatransjob.MyJOb"/> <!-- value中配置的是自定义的任务类 -->
<property name="jobDataAsMap"><!-- 所有的任务类都可以写在map中,当定时任务中需要注入别的bean的时候,就可以在这里注入,我里面输入了一个jobClass类 -->
<map>
<entry key="jobClass" value-ref="jobClass"/>
</map>
</property>
</bean>
<!-- 相关的时间配置 -->
<bean class="org.springframework.scheduling.quartz.SimpleTriggerBean" id="MyTimesimpleTriggerBean">
<property name="jobDetail" ref="MyTimeSpringJob"/> <!-- 给MyTimeSpringJob配置时间信息,name的jobDetail是spring内部需要注入的名字 -->
<property name="repeatInterval" value="300000"/> <!--相隔1000毫秒执行一次 -->
<property name="startDelay" value="3000"/> <!--应用服务器启动3000毫秒后开始执行任务 -->
</bean> <!-- ***启动定时任务*** -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="MyTimesimpleTriggerBean"/>
</list>
</property>
</bean>
<!--*********************************** 定时任务相关配置 end ***********************************-->
</beans>

数据库的配置文件Jdbc.properties(在src下面)

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc.username=jxbms
jdbc.password=jxbms sqlserver.username=sa
sqlserver.password=sqlserver
sqlserver.url=jdbc\:jtds\:sqlserver\://localhost\:1433/J2EE
sqlserver.driver=net.sourceforge.jtds.jdbc.Driver

定时任务的核心代码结束

定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表的更多相关文章

  1. loadrunner 参数化-如何从数据库中取数据-连接数据库进行参数化

    LoadRunner提供两种参数化取值方式,一种是手动编辑,另一种就是通过连接数据库取值.一般在大型业务并发压力测试时,数据量肯定也都是非常大的,所以手动去编辑就不切实际了,这时用连接数据库的功能就方 ...

  2. php从mysql数据库中取数据

    php从数据库中取数据  面向过程 <?php $server_name="localhost:3306"; //数据库服务器名称 $username="root& ...

  3. android从数据库中取音乐数据

    android从手机数据库中取音乐数据 直接贴代码 public void getMp3(){ list = new ArrayList<>(); Cursor mAudioCursor ...

  4. php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现

    php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现 function data_uri($contents, $mime) { $base64 = base64_encode($c ...

  5. 如何从mysql数据库中取到随机的记录

    如何从mysql数据库中取到随机的记录 一.总结 一句话总结:用随机函数newID(),select top N * from table_name order by newid() ----N是一个 ...

  6. JDBC:从数据库中取数据的一个bug

    先看错误信息: java.sql.SQLException: Before start of result set at com.mysql.jdbc.SQLError.createSQLExcept ...

  7. mybatis从数据库中取数据且分组,返回分组数据

    mapper.xml文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PU ...

  8. loadrunner:从数据库中取值进行参数化

    下面我们介绍用数据库中的用户名来参数化登陆用户名. 框选住登陆名,点鼠标右键,弹出对话框,选择"替换为新参数"弹出对话框,此时参数名输入:name,参数类型选择File,如图 点& ...

  9. .NET 百万级 大数据插入、更新 ,支持多种数据库

    功能介绍  (需要版本5.0.44) 大数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现 当列越多转换越慢,SqlSugar将转换性能做到极致,并且采用数据库最佳API 操作数据库 ...

随机推荐

  1. hibernate cascade=CascadeType.All

    因为时间关系,我在这里测试的环境是一对多的关系里面用到的注解方式的级联,网上也有很多贴子,我也看过了,但是呢,我还是自己总结一下吧,这觉得级联是单向的,不是双向的,意思就是说,我们在设置两个类的对象之 ...

  2. PHP接口使用

    <?php interface IEmployee { function working(); } interface IDeveloper { function Coding(); } cla ...

  3. 记一次SQLServer数据库误删数据找回

            昨天 同事在本机清理数据库表时,连接到了生产机,误删了二十几张表,幸好是晚上加班的时候删除的,生产机上当时是一天一备份,还原备份是最后的策略,最关键的还是要找回数据.         ...

  4. WEB项目后端跨域请求

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  5. [C++] socket - 3 [线程简单例子 代码]

    #include<windows.h> #include<stdio.h> DWORD WINAPI myfun1(LPVOID lpParameter);//声明线程函数 D ...

  6. [BTS] Error Can't update assemblies.

    Removal of the assembly failed. Make sure that all items in the assembly you are trying to remove fu ...

  7. 插件~使用ECharts动态在地图上标识点

    ECharts可以很方便的在网页上绘制地图,图表,并且可以提供下载图像,放大,缩小,拖动等功能,今天主要说一下它的地图类型(type:'map')是如何实现的. 首先在ECharts地图的坐标需要我们 ...

  8. .NET通过RFC读取SAP数据

    本篇文章中我主要讲的是.NET如何通过RFC从SAP中读取数据.为了功能的可复用性,我将调用RFC的代码从业务层中分离出来单独建立在一个namespace中. 当然除了需要我们自己编写代码以外,还需要 ...

  9. 使用Lucene.NET实现数据检索功能

    引言     在软件系统中查询数据是再平常不过的事情了,那当数据量非常大,数据存储的媒介不是数据库,或者检索方式要求更为灵活的时候,我们该如何实现数据的检索呢?为数据建立索引吧,利用索引技术可以更灵活 ...

  10. paip.java c++得到当前类,方法名称以及行号

    paip.java c++得到当前类,方法名称以及行号 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...