是这样的,公司要求我做一个定时更新数据库的功能,数据的来源是从另外一个服务器上取得,然后取出所有的数据,然后导入另外一个数据库,并且要求每天导入一次,把原来的数据替换掉。
按照这个需求我去网上查了很多的资料,也找出了几种解决的办法,但是由于技术不够成熟,最终都放弃了,网上的参考方法是:
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("导入数据失败");
}
//
}
}
};
以上做好之后,只需要自定一个时间,然后它就会在定时间去运行。
功能是现实了,可是我相信还可以更加完善,或者有些漏洞我还没有考虑到的请大虾门指出,或者还有更好的方法借鉴,小弟在此恭候了。
分享到:
相关推荐
将"Job调度存储过程"与"触发器"结合,可以在合适的时间自动执行需要的数据库更新。例如,你可以创建一个触发器来监听特定表的变化,然后用这个触发器启动一个调度的存储过程,该过程负责处理大量数据的更新或清理...
1. **创建存储过程**:首先,你需要编写一个存储过程,包含你希望定时执行的逻辑,比如更新数据库中的某些记录。这个过程可能涉及复杂的查询、数据处理或者与业务逻辑相关的操作。 2. **创建调度作业**:使用DBMS_...
在IT行业中,定时读取Excel更新到数据库是一项常见的任务,特别是在数据管理、数据分析或业务自动化等领域。本场景中,我们使用的Excel版本是2003,这是一个较早的版本,但依然广泛应用于许多组织。以下将详细介绍...
在Java编程环境中,我们可以利用Java的定时任务框架如ScheduledExecutorService或者第三方库Quartz来实现MySQL数据库的定时备份。MySQL数据库备份通常涉及到两种主要的方法:全量备份和增量备份。全量备份是复制整个...
【定时备份数据库】是保障数据安全的重要措施,尤其是在企业级应用中,确保数据的完整性和可恢复性至关重要。本文将详细介绍如何在Linux环境下,利用MySQL数据库的`mysqldump`工具实现定时备份,并提供了一个亲测...
PHP端(Linux服务器)每两秒向MySQL数据库执行一条命令的定时任务解决方案,主要用了crontab命令,过程是系统每分钟执行crontab.sh,crontab.sh可以执行一分钟,每两秒调用createtable.php一次,与数据库相关的代码...
本文将详细探讨如何使用C++编程语言与MySQL数据库结合,实现一个全自动定时查数据库统计数据的系统。 首先,我们需要理解“全自动定时查数据库统计数据”这个概念。这通常涉及到两个主要部分:一是自动化查询,二是...
本文将详细介绍如何使用Navicat for MySQL进行数据库的定时备份以及数据恢复,这对于保护数据库免受意外损坏或数据丢失至关重要。Navicat是一款强大的数据库管理工具,支持多种数据库系统,包括MySQL。 ### 一、...
在`TimerTask`子类中,我们可以编写数据库操作的逻辑,如查询、插入、更新或删除数据。例如: ```java class DatabaseTask extends TimerTask { private Connection conn; public DatabaseTask(Connection conn)...
然后,我们需要一个服务类来从数据库中获取定时任务的配置,并使用`@Autowired`的`SchedulerConfig`实例来更新任务配置: ```java @Service public class TaskService { @Autowired private SchedulerConfig ...
标题 "C# 定时更新程序(支持Access数据库更新)" 涉及到的核心技术是C#编程语言以及数据库管理,特别是与Access数据库的交互。C#是一种面向对象的编程语言,广泛应用于Windows应用程序开发,包括桌面应用和服务器端...
数据库操作则涵盖了对数据的CRUD(创建、读取、更新、删除)操作,以及更复杂的查询和事务处理。常见的数据库管理系统有MySQL、Oracle、SQL Server、PostgreSQL等。数据库操作在业务逻辑中扮演着核心角色,例如用户...
定时任务备份数据库并且保留几天的数据。
接着,我们可以使用Recordset对象来读取、写入或更新数据库中的数据。在本例中,我们将使用Recordset来执行SQL命令,例如创建备份文件或读取备份设置。 定时功能的实现,可以借助VB的Timer控件。当Timer控件的...
Oracle数据库是企业级广泛应用的...通过上述步骤,你就能设置好Oracle数据库的定时备份,并利用RAR工具进行压缩,确保数据的安全性。记住,定期检查并测试备份的完整性和可恢复性同样重要,以验证备份策略的有效性。
**Ajax 定时读取数据库技术详解** Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使得网页实现异步更新,提高了用户...
总之,MySQL定时备份数据库是确保业务连续性和数据安全的关键实践。通过选择合适的备份方法并结合自动化工具,可以有效地管理和保护数据库。务必定期测试备份以验证其可恢复性,并根据业务需求调整备份策略。
MySQL 自动定时备份数据库的方法 MySQL 是一个流行的开源关系数据库管理系统,随着数据量的增加,数据库的备份变得越来越重要。备份数据库可以保护数据的安全和完整性,避免数据丢失或损坏。MySQL 自动定时备份...
在Linux环境中,对PostgreSQL数据库进行定时备份是确保数据安全的重要步骤。PostgreSQL是一个功能强大的开源关系型数据库系统,广泛应用于各种规模的企业和项目。定时备份可以帮助我们在系统故障、误操作或其他不可...
标题和描述提到的"window定时工具"可能是指利用这些工具来实现定时备份数据库和定时提醒的功能。下面我们将深入探讨这两个核心知识点。 一、Windows任务计划程序 Windows任务计划程序是操作系统自带的一个实用工具...