`

定时更新数据库

阅读更多
   是这样的,公司要求我做一个定时更新数据库的功能,数据的来源是从另外一个服务器上取得,然后取出所有的数据,然后导入另外一个数据库,并且要求每天导入一次,把原来的数据替换掉。
   按照这个需求我去网上查了很多的资料,也找出了几种解决的办法,但是由于技术不够成熟,最终都放弃了,网上的参考方法是:
   1.使用quartz框架,这是纯Java开发的框架,使用起来也很简单,只要自己定义一个Job,创建一个触发器即可。
   2.使用定时作业,这个我不是很清楚,所以首先放弃了。
   3.使用存储过程和Job,由于很久没接触过存储过程,很多知识也记不清了,所以也放弃了
   4.有的建议是用DTSX,说实话到现在我还不知道它是个什么东东。

   这些方法我都去尝试过,但是后来我还是用了自己最笨的方法,用java做了个定时器,定时去调用取数据,和导数据的方法,这个功能是实现了,我测试过也没什么问题,数据也没有丢失的现实。因为还没有正式使用,所以还找不出问题所在,现在我把我的思路和实现的方法给大家看下,如果有问题,请大家指导下,本人现谢过了。
  
   首先由于在导数据的时候,操作员要了解数据是否导入,或者是否已导入成功,要涉及到日志,所以我自己写了一个专门写日志的一个类,代码如下:
    
       public class PrintLog {
     
	
	public PrintLog(){
		
	}
	public static void  writeLog(String log){
		//获取文件缓冲流
		BufferedWriter writer=null;
		try {
			FileWriter fileWriter = new FileWriter("D://log.txt",true);
			 writer=new BufferedWriter(fileWriter);
		//格式化写入时间
			 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			 String writetime=sdf.format(new Date());
			 writer.write(writetime);//写入时间
			 writer.write(log);//写入日志内容
			 writer.newLine();
			 writer.flush();
			 writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
     
   

   接下来我就用jdbc实现的导入数据的功能,由于目前只有一个表。所以实现起来也很简单。但是问题是如果数据量大,会不会有数据重复,溢露的现象呢,这个我也无从分析,反正我用10000条数据测试了下,没有什么问题。然后就是效率的问题,我是每条数据都去执行一次插入,还是去批量的插入。后来我发现jdbc支持批量的插入,所以我选择了批量的插入。
代码如下:
   
     public class DB {
	
	 static int precount=100; 
	
	 public static  Connection getConnect() throws Exception{
		   Class.forName("com.mysql.jdbc.Driver");
		   Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8", "root", "root");
        return conn;        
	  }
	 //插入数据
	 public static int insertObject(List<PoAJ> list){
		 Connection conn=null;
		 PreparedStatement ps=null;
		 try {
			conn=DB.getConnect();
			//关闭自动提交
			conn.setAutoCommit(false);
			//清空数据库
			ps=conn.prepareStatement("truncate poaj");
			//ps.executeUpdate();这里我没用执行,因为一旦出错,没法回滚!
			
			long startTime=System.currentTimeMillis();
			String sql="insert into poaj(ah,name,data)values(?,?,?)";			
			ps=conn.prepareStatement(sql);
			for(int i=0;i<list.size();i++){
				PoAJ p=list.get(i);
			ps.setString(1,p.getAh());
			ps.setString(2,p.getName());
			ps.setInt(3, p.getData());
			ps.addBatch();
			//每precount次就批量处理一次
			}
			//提交
			ps.executeBatch();
		 	conn.commit();
		 	ps.clearBatch();
		 	long endTime=System.currentTimeMillis();
		 	System.out.println("插入数据时间为:"+(endTime-startTime));
		 	return (int)endTime;
		} catch (Exception e) {
			try {
				//如果出现问题就回滚
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally{
				try {
					if(ps!=null) ps.close();
					if(conn!=null) conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}
		 return -1;  
	 }
}
     

     导数据的功能都有了,现在只差如何实现定时去导入数据,所以我用java做了个定时器,在特定是时间执行,这个类我是用timer实现的,它是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。实现的方法如下:
    
      class PickTask{
	
	private Timer timer;
	private String time;//触发时间
	public PickTask(String time){
		timer=new Timer();
		this.time=time;
	}
	
	private TimerTask task=new TimerTask(){
		@Override
		public void run() {
		    	Date date = new Date();
			   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			   String beginDate = sdf.format(date);
			   //截取时间段
			   String beginTime = beginDate.substring(11, 16);
			   System.out.println(beginDate+" "+beginTime);
			  // PrintLog log=new PrintLog();
			   if(beginTime.equals(time)){
				 PrintLog.writeLog("开始取出数据");
				 //这里我自定义了1000条数据
				 
				 List<PoAJ> l=new ArrayList<PoAJ>();
				 long startTime=System.currentTimeMillis();
				for(int i=10000;i<20000;i++){
					PoAJ p=new PoAJ();
					p.setAh(""+i);
					p.setName(""+i);
					p.setData(i);
					l.add(p);
				}
				long endTime=System.currentTimeMillis();
				PrintLog.writeLog("取出数据数量为"+l.size()+" 时间为:"+(endTime-startTime)+"ms");
				 PrintLog.writeLog("开始导入数据");
				 
				 int ret=DB.insertObject(l);
				 
				 if(ret>0){
					 PrintLog.writeLog("导入数据成功,时间为:"+ret+"ms");
				 }else{
					 PrintLog.writeLog("导入数据失败");
				 }
				 //
			   }
			  
		}
		
		
	};
     

     以上做好之后,只需要自定一个时间,然后它就会在定时间去运行。
     功能是现实了,可是我相信还可以更加完善,或者有些漏洞我还没有考虑到的请大虾门指出,或者还有更好的方法借鉴,小弟在此恭候了。
分享到:
评论

相关推荐

    oracle中job调度存储过程 触发器 定时更新数据库.rar

    将"Job调度存储过程"与"触发器"结合,可以在合适的时间自动执行需要的数据库更新。例如,你可以创建一个触发器来监听特定表的变化,然后用这个触发器启动一个调度的存储过程,该过程负责处理大量数据的更新或清理...

    oracle job调度存储过程 触发器 定时更新数据库

    1. **创建存储过程**:首先,你需要编写一个存储过程,包含你希望定时执行的逻辑,比如更新数据库中的某些记录。这个过程可能涉及复杂的查询、数据处理或者与业务逻辑相关的操作。 2. **创建调度作业**:使用DBMS_...

    定时读取excel更新到数据库

    在IT行业中,定时读取Excel更新到数据库是一项常见的任务,特别是在数据管理、数据分析或业务自动化等领域。本场景中,我们使用的Excel版本是2003,这是一个较早的版本,但依然广泛应用于许多组织。以下将详细介绍...

    java 定时备份数据库

    在Java编程环境中,我们可以利用Java的定时任务框架如ScheduledExecutorService或者第三方库Quartz来实现MySQL数据库的定时备份。MySQL数据库备份通常涉及到两种主要的方法:全量备份和增量备份。全量备份是复制整个...

    定时备份数据库,及问题总结 亲测有效

    【定时备份数据库】是保障数据安全的重要措施,尤其是在企业级应用中,确保数据的完整性和可恢复性至关重要。本文将详细介绍如何在Linux环境下,利用MySQL数据库的`mysqldump`工具实现定时备份,并提供了一个亲测...

    Linux定时更新MySQL数据库

    PHP端(Linux服务器)每两秒向MySQL数据库执行一条命令的定时任务解决方案,主要用了crontab命令,过程是系统每分钟执行crontab.sh,crontab.sh可以执行一分钟,每两秒调用createtable.php一次,与数据库相关的代码...

    C# 定时更新程序(支持Access数据库更新)

    标题 "C# 定时更新程序(支持Access数据库更新)" 涉及到的核心技术是C#编程语言以及数据库管理,特别是与Access数据库的交互。C#是一种面向对象的编程语言,广泛应用于Windows应用程序开发,包括桌面应用和服务器端...

    全自动定时查数据库统计数据

    本文将详细探讨如何使用C++编程语言与MySQL数据库结合,实现一个全自动定时查数据库统计数据的系统。 首先,我们需要理解“全自动定时查数据库统计数据”这个概念。这通常涉及到两个主要部分:一是自动化查询,二是...

    [数据库] Navicat for MySQL定时备份数据库及数据恢复1

    本文将详细介绍如何使用Navicat for MySQL进行数据库的定时备份以及数据恢复,这对于保护数据库免受意外损坏或数据丢失至关重要。Navicat是一款强大的数据库管理工具,支持多种数据库系统,包括MySQL。 ### 一、...

    Java定时操作数据库测试Demo

    在`TimerTask`子类中,我们可以编写数据库操作的逻辑,如查询、插入、更新或删除数据。例如: ```java class DatabaseTask extends TimerTask { private Connection conn; public DatabaseTask(Connection conn)...

    Springboot中使用数据库配置定时任务

    然后,我们需要一个服务类来从数据库中获取定时任务的配置,并使用`@Autowired`的`SchedulerConfig`实例来更新任务配置: ```java @Service public class TaskService { @Autowired private SchedulerConfig ...

    定时任务加数据库操作demo

    数据库操作则涵盖了对数据的CRUD(创建、读取、更新、删除)操作,以及更复杂的查询和事务处理。常见的数据库管理系统有MySQL、Oracle、SQL Server、PostgreSQL等。数据库操作在业务逻辑中扮演着核心角色,例如用户...

    MySQL5.7定时备份数据库

    定时任务备份数据库并且保留几天的数据。

    定时备份数据库(VB+ACCESS)源码

    接着,我们可以使用Recordset对象来读取、写入或更新数据库中的数据。在本例中,我们将使用Recordset来执行SQL命令,例如创建备份文件或读取备份设置。 定时功能的实现,可以借助VB的Timer控件。当Timer控件的...

    Oracle定时备份数据库命令代码

    Oracle数据库是企业级广泛应用的...通过上述步骤,你就能设置好Oracle数据库的定时备份,并利用RAR工具进行压缩,确保数据的安全性。记住,定期检查并测试备份的完整性和可恢复性同样重要,以验证备份策略的有效性。

    Ajax定时读取数据库(源代码发布)

    **Ajax 定时读取数据库技术详解** Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使得网页实现异步更新,提高了用户...

    mysql定时备份数据库文档及工具

    总之,MySQL定时备份数据库是确保业务连续性和数据安全的关键实践。通过选择合适的备份方法并结合自动化工具,可以有效地管理和保护数据库。务必定期测试备份以验证其可恢复性,并根据业务需求调整备份策略。

    mysql自动定时备份数据库的方法

    MySQL 自动定时备份数据库的方法 MySQL 是一个流行的开源关系数据库管理系统,随着数据量的增加,数据库的备份变得越来越重要。备份数据库可以保护数据的安全和完整性,避免数据丢失或损坏。MySQL 自动定时备份...

    window定时工具,可以定时备份数据库,定时提醒等!

    标题和描述提到的"window定时工具"可能是指利用这些工具来实现定时备份数据库和定时提醒的功能。下面我们将深入探讨这两个核心知识点。 一、Windows任务计划程序 Windows任务计划程序是操作系统自带的一个实用工具...

    postgresql数据库定时备份脚本(linux)

    在Linux环境中,对PostgreSQL数据库进行定时备份是确保数据安全的重要步骤。PostgreSQL是一个功能强大的开源关系型数据库系统,广泛应用于各种规模的企业和项目。定时备份可以帮助我们在系统故障、误操作或其他不可...

Global site tag (gtag.js) - Google Analytics