服务器之间通过sftp的方式同步文件,并入库到本地数据的表中

本文介绍了一种从A服务器定时下载CSV文件至B服务器,并通过SQLLoader将数据批量导入Oracle数据库的方法。包括配置SQLLoader控制文件、编写Shell脚本实现数据同步及定时任务的创建。
部署运行你感兴趣的模型镜像

需求:A服务器会定时生成一个CSV文件,B服务器从A服务器下载下来,并存入到B服务器的oracle数据库的某表中。

 

分析:1.数据同步上传和下载可以使用ftp的方式,当然也有其他方式。

2.数据存到本地后可以使用oracle自带的sqloader来加载文件到数据库中。

也可以选择dblink,网上说效率没这个高。未亲测。

 

实施:

1.写一个sqlloader的控制文件,取名为res_count.ctl

OPTIONS (skip=1,rows=128)
load data
infile '/wjjk_oracle/export_files/fm_to_datang_files/res_count.txt'   --本来这里是res_count.csv文件,但是不知道是不是对方提供的csv编码有问题,导进去为空,就转成了制表符的txt。网上说该有asc||码。
truncate
INTO TABLE res_count
fields terminated by X'09' --X'09'表示制表符,这样也行'  '
trailing nullcols ( emsname, devicename, kind, num )

关于sqlloader的更多知识请浏览:http://blog.csdn.net/ytfy12/article/details/53043814

2.写一个shell脚本,取名为:res_count.sh.做数据同步,并执行sqlloder的控制文件。

#!/bin/sh
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1/
export LANG=en_US.utf8
HOST=11.11.11.11
USER=net
PASS=OSUsernet_
cd /wjjk_oracle/export_files/fm_to_datang_files
echo "Starting to sftp..."
#nohup  sqlplus rmssc/rms4sc @/wjjk_oracle/export_script/fm_to_datang/res_count_delete.sql
curdate="`date +%Y%m%d`"
filename="$curdate"".csv"
lftp -u ${USER},${PASS} sftp://${HOST} <<EOF
cd /backup/statistics
mget $filename
bye
EOF
mv ${filename} res_count.csv
echo 'start sqlldr'
/u01/app/oracle/product/11.2.0/db_1/bin/sqlldr user/password@rms_51 control='/wjjk_oracle/export_script/fm_to_datang/res_count.ctl'mv res_count.csv ${filename}

这里大概逻辑就是设置oracle的目录,编码,设置几个变量为你要连接的服务器的账号、密码、地址。

对方规定每天会生产20180321.csv这种格式的文件。我们去取回来。最后执行sqlldr进行入库操作。

3.最后创建一个定时任务,crontab这个命令,可以网上自己查用法。

00 22 * * * /wjjk_oracle/export_script/fm_to_datang/res_count.sh >> /wjjk_oracle/export_script/fm_to_datang/res_count.log 2>&1 &

没记错的话,每天0点22就会定时执行了。

 

转载于:https://www.cnblogs.com/wenlin66/p/8615719.html

您可能感兴趣的与本文相关的镜像

EmotiVoice

EmotiVoice

AI应用

EmotiVoice是由网易有道AI算法团队开源的一块国产TTS语音合成引擎,支持中英文双语,包含2000多种不同的音色,以及特色的情感合成功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。

<think>好的,我现在需要帮助用户解决在Java中使用Vector存储sftp.ls("*")结果的问题。首先,我需要确认用户的具体需求和使用场景。用户可能正在通过JSch或其他SFTP连接到远程服务器,并希望将ls命令的结果存储到Vector中。 首先,我应该回忆一下JSch的基本用法,尤其是SFTP部分。SFTPChannel.ls方法返回的是一个Vector,其中每个元素是LsEntry对象,包含文件名、属性等信息。用户可能已经正确获取了这些数据,但可能在使用过程中遇到了问题,比如类型转换错误或数据存储不正确。 接下来,我需要考虑可能的常见问题。例如,用户是否正确处理了文件的获取过程?是否有异常处理?另外,Vector虽然线程安全,但在Java中现在更推荐使用ArrayList,除非确实需要同步操作。不过用户明确提到使用Vector,所以可能是有特定需求。 然后,我需要构造一个示例代码,展示如何连接SFTP,执行ls命令,并将结果存储到Vector中。同时,需要注意关闭连接和异常处理的部分,确保资源不被泄露。用户可能需要代码中的每个步骤解释,比如设置JSch,获取Session,打开Channel,执行ls命令,然后处理返回的Vector。 另外,用户的问题可能涉及如何处理ls返回的结果,比如过滤文件、获取文件名或属性,或者可能遇到的权限问题。在示例代码中,遍历Vector并输出文件名是一个常见的操作,可以展示如何正确使用LsEntry对象。 还需要考虑潜在的错误,比如连接失败、路径不存在、权限不足等,所以在代码中添加适当的异常处理是必要的。同时,用户可能需要知道如何添加依赖,比如JSch的Maven配置,但用户没有提到构建工具,所以可能需要简要说明如何引入。 最后,生成的相关问题需要围绕用户可能进一步的需求,比如过滤文件类型、处理大型文件的效率问题,或者替代Vector的其他数据结构。这些问题可以帮助用户更深入地理解和应用他们当前的解决方案。</think>### Java中使用Vector存储SFTP文件的实现方法 在Java中通过JSch连接SFTP服务器时,`ChannelSftp.ls()`方法会返回包含文件的`Vector<ChannelSftp.LsEntry>`对象。以下是完整实现示例: ```java import com.jcraft.jsch.*; import java.util.Vector; public class SftpFileLister { public static void main(String[] args) { JSch jsch = new JSch(); Session session = null; ChannelSftp channel = null; try { // 1. 建立SFTP连接 session = jsch.getSession("username", "hostname", 22); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword("password"); session.connect(); // 2. 打开SFTP通道 Channel channel = session.openChannel("sftp"); channel.connect(); channel = (ChannelSftp) channel; // 3. 获取文件并存储到Vector Vector<ChannelSftp.LsEntry> fileList = channel.ls("*"); // 4. 遍历处理结果 for (ChannelSftp.LsEntry entry : fileList) { if (entry.getAttrs().isDir()) continue; // 跳过目录 System.out.println("文件名: " + entry.getFilename()); System.out.println("文件大小: " + entry.getAttrs().getSize()); } } catch (JSchException | SftpException e) { e.printStackTrace(); } finally { // 5. 关闭连接 if (channel != null) channel.disconnect(); if (session != null) session.disconnect(); } } } ``` 关键点说明: 1. 使用`channel.ls("*")`获取当前目录所有文件,返回`Vector<LsEntry>` 2. `LsEntry`包含文件名和文件属性(大小、类型、权限等) 3. 需要处理SFTP连接异常和权限问题 4. 建议添加文件名过滤逻辑(如排除隐藏文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值