验证中...
语言: Java
分类: 数据库相关
最后更新于 2018-08-10 19:56
大数据批量插入性能优化
原始数据 复制代码
package util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
import DateUtils;
import config.env.EnvConfigManager;
/**
* SqlLoader帮助类
*
*/
public class SqlLoaderUtil {
private final static String os_win = "windows";
// private final static String os_unix = "unix";
// private final static String os_linux = "linux";
//文件路径
private String filePath="";
//ctl文件存放路径
private String ctlUrl="";
//text文件存放路径
private String textUrl="";
//日志文件存放路径
private String logUrl="";
private static SqlLoaderUtil instance = new SqlLoaderUtil();
public static SqlLoaderUtil getInstance() {
return instance;
}
/**
* 通过sqlLoader方式插入数据
* @param datalist 数据list
* @param object 对象:new 对象()
* @param tablename 表名
*/
public void sqlLoaderInsert(List<?> datalist,Object object,String tablename){
String lowtablename=tablename.toLowerCase();
//获取对象字段类型格式map
Map<String, String> filedtypemap =ObjectToMap.beanToMapGetFields(object);
//设置保存路径
setSaveFilePath(lowtablename);
//写ctl文件
StringBuffer sbctl=new StringBuffer();
sbctl.append("load data " +
" infile '"+textUrl+
"' append into table " +lowtablename+
" FIELDS TERMINATED BY '|'" +
" trailing nullcols(");
//循环列头
String detailstr="";
for(Map.Entry<String, String> entry:filedtypemap.entrySet()){
if(entry.getValue()!=null && entry.getValue().length()>0){
String valuestr=entry.getKey()+" \"TO_DATE(:"+entry.getKey()+",'"+entry.getValue()+"')\"";
detailstr=detailstr+valuestr+",";
}else{
detailstr=detailstr+entry.getKey()+",";
}
}
if(detailstr.length()>0){
detailstr=detailstr.substring(0, detailstr.length()-1);
sbctl.append(detailstr);
}
sbctl.append(")");
File f = new File(ctlUrl);
OutputStream out = null;
try {
out = new FileOutputStream(f);
// 将字符串转成字节数组
byte b[] = sbctl.toString().getBytes();
// 将byte数组写入到文件之中
out.write(b);
out.close();
}catch (Exception e){
e.printStackTrace();
}
//写数据txt文件
try {
StringBuffer datatext=new StringBuffer();
for(int i=0;i<datalist.size();i++){
Map<String, Object> resultmap=ObjectToMap.beanToMap(datalist.get(i));
String detailtextstr="";
for(Map.Entry<String, Object> entry:resultmap.entrySet()){
//对于日期型,需要设置日期格式
String colnummapvalue=filedtypemap.get(entry.getKey());
//有设置日期格式
if(colnummapvalue!=null && colnummapvalue.length()>0 && entry.getValue()!=null){
String datestr="";
if(colnummapvalue.equals("YYYY/MM/DD")){
datestr=DateUtils.convertDateToString((Date)entry.getValue(), "yyyy-MM-dd");
}
else if(colnummapvalue.equals("YYYY/MM/DD hh24:mi:ss")){
try {
datestr=DateUtils.convertDateToString((Date)entry.getValue(), "yyyy-MM-dd HH:mm:ss");
} catch (Exception e) {
System.out.println("");
}
}
else{
datestr=DateUtils.convertDateToString((Date)entry.getValue(), "yyyy-MM-dd HH:mm:ss");
}
detailtextstr=detailtextstr+datestr+"|";
}else{
if(entry.getValue()==null){
detailtextstr=detailtextstr+"|";
}else{
detailtextstr=detailtextstr+entry.getValue()+"|";
}
}
}
if(detailtextstr.length()>0){
detailtextstr=detailtextstr.substring(0, detailtextstr.length()-1);
datatext.append(detailtextstr);
}
if(i<datalist.size()-1){
datatext.append("\n");
}
}
File textfile = new File(textUrl);
OutputStream textout = null;
try {
textout = new FileOutputStream(textfile);
// 将字符串转成字节数组
byte b[] = datatext.toString().getBytes();
// 将byte数组写入到文件之中
textout.write(b);
textout.close();
}catch (Exception e){
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 设置文件存放路径
* @param lowtablename
*/
private void setSaveFilePath(String lowtablename) {
String tablename=lowtablename.toLowerCase();
//获取临时文件路径
String seperator=System.getProperty("file.separator");
//文件路径
filePath = EnvConfigManager.getInstance().getSystemmanager().getSysfilepath()+seperator+"sqlloader"+seperator+"file";
//日志路径
String logPath = EnvConfigManager.getInstance().getSystemmanager().getSysfilepath()+seperator+"sqlloader"+seperator+"log";
//text文件存放路径
textUrl=filePath+seperator+tablename+".txt";
//ctl文件存放路径
ctlUrl=filePath+seperator+tablename+".ctl";
//日志文件存放路径
logUrl=logPath+seperator+tablename+".log";
//判断文件夹是否存在,若不存在在新建
File checkFilePath = new File(filePath);
if (!checkFilePath.exists()) {
checkFilePath.mkdirs();
}
//判断文件夹是否存在,若不存在在新建
File checkLogPath = new File(logPath);
if (!checkLogPath.exists()) {
checkLogPath.mkdirs();
}
}
/**
* 执行sqlloader
* @param tablename
* @return
* @throws IOException
*/
public void exeSqlloader(String tablename) throws IOException{
//获取系统环境信息
String os = getOsName();
String sysfilepath=EnvConfigManager.getInstance().getSystemmanager().getSysfilepath();
//获取数据库配置信息
String ip=EnvConfigManager.getInstance().getDataconninfo().getIp();
String port=EnvConfigManager.getInstance().getDataconninfo().getPort();
String instance=EnvConfigManager.getInstance().getDataconninfo().getInstance();
String user=EnvConfigManager.getInstance().getDataconninfo().getUser();
String password=EnvConfigManager.getInstance().getDataconninfo().getPassword();
//windows系统调用
if (os.toLowerCase().startsWith(os_win)){
SqlLoaderUtil sqlloaderutil=new SqlLoaderUtil();
sqlloaderutil.cmdExeSqlloader(sysfilepath,user,password,ip,port,instance ,ctlUrl,logUrl);
}
else{
SqlLoaderUtil sqlloaderutil=new SqlLoaderUtil();
sqlloaderutil.shellExeSqlloader(sysfilepath,user,password,ip,port,instance ,ctlUrl,logUrl);
}
}
/**
* 通过cmd调用sqlloader
* @param path
* @param username
* @param password
* @param ip
* @param port
* @param instance
* @param ctlUrl
* @param logUrl
* @throws IOException
*/
private void cmdExeSqlloader(String sysfilepath,String user,String password,String ip,String port,String instance ,String ctlUrl,String logUrl) throws IOException{
//通过cmd调用sqlloader
String strcmd="cmd /c sqlldr userid="+user+"/"+password+
"@"+ip+":"+port+"/"+instance+" control="+ctlUrl+" log="+logUrl;
Runtime.getRuntime().exec(strcmd);
}
/**
* 通过shell调用sqlloader
* @param path
* @param username
* @param password
* @param ip
* @param port
* @param instance
* @param ctlUrl
* @param logUrl
* @throws IOException
*/
private void shellExeSqlloader(String sysfilepath,String user,String password,String ip,String port,String instance ,String ctlUrl,String logUrl) throws IOException{
//通过shell调用sqlloader
String strcmd="sqlldr userid="+user+"/"+password+
"@"+ip+":"+port+"/"+instance+" control="+ctlUrl+" log="+logUrl;
Runtime.getRuntime().exec(strcmd);
}
/**
* 销毁sqlloader使用到的临时文件
*/
public void destroySqlloader(){
deleteDir(new File(filePath));
}
/**
* 递归删除目录下的所有文件及子目录下所有文件
* @param dir 将要删除的文件目录
* @return boolean
*/
private boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
//递归删除目录中的子目录下
for (int i=0; i<children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// 目录此时为空,可以删除
return dir.delete();
}
/**
* 得到操作系统名称
* @return
*/
public static String getOsName() {
String os = "";
os = System.getProperty("os.name");
return os;
}
}

评论列表( 0 )

你可以在登录后,发表评论

搜索帮助