多线程 批处理 数据导入工具 Java
来源:互联网 发布:床上用品在哪买 知乎 编辑:程序博客网 时间:2024/06/06 00:24
由于在工作中经常需要进行数据的导入…..
调用
package com.lb.impl.qikandaohang.changecls;import java.sql.ResultSet;import java.sql.SQLException;import org.apache.commons.lang3.StringUtils;import com.lb.template.bantchexecute.QueryAndUpdateOneTemplateV2;import com.lb.util.Database;public class ChageImpactFactor extends QueryAndUpdateOneTemplateV2 { public ChageImpactFactor(Database srcDb, Database descDb) { super(srcDb, descDb); } public static void main(String[] args) { Database srcDb = new Database("sa", "123456", "jdbc:sqlserver://192.168.2.44:1433;DatabaseName=Ixuehsu", com.lb.util.Constants.SQLSERVER_DRIVER); Database desc = new Database("sa", "123456", "jdbc:sqlserver://192.168.2.203:1433;DatabaseName=DB_wulixi", com.lb.util.Constants.SQLSERVER_DRIVER); String querySql = "SELECT ISSN, [封面], [综合影响因子] FROM [期刊封面]"; QueryAndUpdateOneTemplateV2 template = new ChageImpactFactor(srcDb, desc); template.execute(querySql); } @Override public String getOprationSql(ResultSet resultSet) throws SQLException { String issn = resultSet.getString("ISSN").trim(); String cover = getCover(resultSet.getString("封面")); String impactfactory = getImfactory(resultSet.getString("综合影响因子")); if (StringUtils.isNotBlank(issn)) { String updateSql = "UPDATE wlx_journal SET cover = '" + cover + "', impact_factory = '" + impactfactory + "' WHERE ISSN LIKE '%" + issn + "%';"; return updateSql; } return null; } private String getImfactory(String string) { if (StringUtils.isNotBlank(string)) { return string; } else { return "0.0"; } } private static String getCover(String string) { try { String url = string.substring(string.indexOf("/") + 1, string.indexOf(".")); return url; } catch (Exception e) { return ""; } }}
package com.lb.template.bantchexecute;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.atomic.AtomicInteger;import org.apache.commons.lang3.StringUtils;import com.lb.util.DBManager;import com.lb.util.Database;public abstract class QueryAndUpdateOneTemplateV2 { private DBManager srcDbMg; private DBManager descDbMg; private static AtomicInteger totalCount = new AtomicInteger(); /** * 一次执行多少条 sql */ private static final int SQL_BUFFER_COUNT = 1; /** * 最大线程数 */ private static final int MAX_THREAD_COUNT = 1; private static final String END_FLAG = "_END_"; private BlockingQueue<String> sqlsQueue = new ArrayBlockingQueue<>(10000); public QueryAndUpdateOneTemplateV2(Database srcDb, Database descDb) { this.srcDbMg = new DBManager(srcDb.getUserName(), srcDb.getPassword(), srcDb.getUrl(), srcDb.getDriver()); this.descDbMg = new DBManager(descDb.getUserName(), descDb.getPassword(), descDb.getUrl(), descDb.getDriver()); } public void execute(String querySql) { long start = System.currentTimeMillis(); Reader reader = new Reader(querySql); reader.start(); for (int i = 0; i < MAX_THREAD_COUNT; i++) { Writer writer = new Writer(); writer.start(); } long end = System.currentTimeMillis(); // System.out.println("[修改完成], 共修改:" + totalCount.get() + ",耗时:" + (end - start) + ",毫秒"); } /** * sql 读取者 * @author admin * */ private class Reader extends Thread{ private String querySql; public Reader(String querySql) { this.querySql = querySql; } @Override public void run() { System.out.println("读取线程启动...."); Connection srcConn = srcDbMg.getConnection(); int queryCount = 0; if (StringUtils.isBlank(querySql)) { System.out.println("查询语句不为空"); return; } try { PreparedStatement pstm = srcConn.prepareStatement(querySql); ResultSet resultSet = pstm.executeQuery(); System.out.println("读取线程 开始读取..."); while (resultSet.next()) { addOneSqlToBuffer(resultSet, sqlsQueue); queryCount += 1; } sqlsQueue.put(END_FLAG); System.out.println("读取完成, 共生成sql:" + queryCount + "次"); } catch (Exception e) { e.printStackTrace(); } } } /** * sql 写入者 * * @author admin * */ private class Writer extends Thread{ private List<String> sqlBuffer = new ArrayList<String>(); private int executeCount; @Override public void run() { System.out.println("写入线程:" + Thread.currentThread().getName() + "启动..."); int count = 0; while(true) { try { String sql = sqlsQueue.take(); if (StringUtils.isNotBlank(sql) && sql.equals(END_FLAG)) { sqlsQueue.put(END_FLAG); break; } sqlBuffer.add(sql); count += 1; if (count >= SQL_BUFFER_COUNT) { long start1 = System.currentTimeMillis(); descDbMg.executes(sqlBuffer); long end1 = System.currentTimeMillis(); executeCount += SQL_BUFFER_COUNT; System.out.println(Thread.currentThread().getName() + "已修改:" + executeCount + ", 耗时:" + (end1 - start1)); totalCount.addAndGet(SQL_BUFFER_COUNT); sqlBuffer.clear(); count = 0; } } catch (InterruptedException e) { e.printStackTrace(); sqlBuffer.clear(); count = 0; continue; } } if (sqlBuffer.size() != 0) { descDbMg.executes(sqlBuffer); executeCount = executeCount + sqlBuffer.size(); } System.out.println(Thread.currentThread().getName() + "[修改完成], 共修改:" + executeCount); } } private void addOneSqlToBuffer(ResultSet resultSet, BlockingQueue<String> sqlsQueue) throws SQLException { String sql = getOprationSql(resultSet); if (StringUtils.isNotBlank(sql)) { try { sqlsQueue.put(sql); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 通过 查询结果集 生成 操作语句 * * @param resultSet * @return * @throws SQLException */ public abstract String getOprationSql(ResultSet resultSet) throws SQLException;}
package com.lb.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.List;import java.util.Map;public class DBManager { private String userName; private String password; private String url; private String driver; public DBManager(String userName, String password, String url, String driver) { this.userName = userName; this.password = password; this.url = url; this.driver = driver; } public Connection getConnection() { Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, userName, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public void close(ResultSet rs, Statement statement, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public void close(ResultSet rs, PreparedStatement ps, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 批量执行多条 sqls, 一条失败全部回滚 */ public void executes(List<String> sqls) { Connection conn = null; Statement statement = null; conn = getConnection(); // 禁用自动提交 try { statement = conn.createStatement(); conn.setAutoCommit(false); for (String sql : sqls) { statement.addBatch(sql); } statement.executeBatch(); // 提交事务 conn.commit(); conn.setAutoCommit(true); } catch (SQLException e) { for (String sql : sqls) { System.out.println(sql); } System.out.println("出错了"); e.printStackTrace(); if (conn != null) { // 事务回滚 try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } } finally { close(null, statement, conn); } } /** * 执行多条 一个模板的多条sql语句, 一条失败全部回滚 (测试没通过) * * String : sql * Object[] : params */ public void batchExecuteByTempalte(String sqlTemplate, List<Object[]> params) throws RuntimeException{ Connection conn = null; PreparedStatement ps = null; conn = getConnection(); // 禁用自动提交 try { ps = conn.prepareStatement(sqlTemplate); conn.setAutoCommit(false); int paramSize = params.size(); Object[] param = null; for (int i = 0; i < paramSize; i++) { param = params.get(i); for (int j = 0; j < param.length; j++) { ps.setObject(j + 1, param[j]); } ps.addBatch(); } ps.executeBatch(); conn.commit(); conn.setAutoCommit(true); } catch (SQLException e) { if (conn != null) { // 事务回滚 try { conn.rollback(); throw new RuntimeException(); } catch (SQLException e1) { e1.printStackTrace(); } } } finally { close(null, ps, conn); } } /** * 执行多条 sqls, 一条失败全部回滚 * sql 不可重复 * String : sql * Object[] : params */ public void executeWithParams(Map<String, Object[]> sqlMap) throws RuntimeException{ Connection conn = null; PreparedStatement ps = null; conn = getConnection(); // 禁用自动提交 try { conn.setAutoCommit(false); for (Map.Entry<String, Object[]> entry : sqlMap.entrySet()) { String sql = entry.getKey(); ps = conn.prepareStatement(sql); Object[] params = entry.getValue(); for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } ps.execute(); } // 提交事务 conn.commit(); } catch (SQLException e) { if (conn != null) { // 事务回滚 try { conn.rollback(); throw new RuntimeException(); } catch (SQLException e1) { e1.printStackTrace(); } } } finally { close(null, ps, conn); } } /** * Map<Object[] : params * String: String * * @param sqlMaps * @throws RuntimeException */ public void executeWithParamsNew(Map<Object[], String> sqlMap) throws RuntimeException{ Connection conn = null; PreparedStatement ps = null; conn = getConnection(); String errorSql = ""; // 禁用自动提交 try { conn.setAutoCommit(false); for (Map.Entry<Object[], String> entry : sqlMap.entrySet()) { String sql = entry.getValue(); errorSql = sql; ps = conn.prepareStatement(sql); Object[] params = entry.getKey(); for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } ps.execute(); } // 提交事务 conn.commit(); } catch (SQLException e) { e.printStackTrace(); System.out.println("error sql is:" + errorSql); if (conn != null) { // 事务回滚 try { conn.rollback(); throw new RuntimeException(); } catch (SQLException e1) { e1.printStackTrace(); } } } finally { close(null, ps, conn); } } /** * 适合单表 * * Map<Object[] : params * String: String * * @param sqlMaps * @throws RuntimeException */ public void bantchExecuteOneTable(Map<Object[], String> sqlMap) throws RuntimeException{ Connection conn = null; PreparedStatement ps = null; conn = getConnection(); // 禁用自动提交 try { conn.setAutoCommit(false); for (Map.Entry<Object[], String> entry : sqlMap.entrySet()) { String sql = entry.getValue(); ps = conn.prepareStatement(sql); Object[] params = entry.getKey(); for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } ps.addBatch(); } ps.executeBatch(); // 提交事务 conn.commit(); conn.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); if (conn != null) { // 事务回滚 try { conn.rollback(); throw new RuntimeException(); } catch (SQLException e1) { e1.printStackTrace(); } } } finally { close(null, ps, conn); } }}
package com.lb.util;/** * 数据库对象 * * @author admin * */public class Database { private String userName; private String password; private String url; private String driver; public Database() {} public Database(String userName, String password, String url, String driver) { super(); this.userName = userName; this.password = password; this.url = url; this.driver = driver; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; }}
阅读全文
0 0
- 多线程 批处理 数据导入工具 Java
- java批处理导入List数据
- java多线程数据导入构想
- java 多线程处理导入数据
- java批处理数据接口
- 大批量快速导入导出数据[SqlServer+批处理]
- 批处理执行sql脚本文件导入数据
- SQL批处理 导入excel数据到表
- 数据导入导出工具
- Java使用多线程导入数据到Oracle中
- 关于Java调用批处理命令向mysql导入数据的中文乱码有关问题
- java导入导出数据到excel的工具类
- java 工具类(将数据导入数据库)
- java 批处理插入数据库数据
- 多线程实现大批量数据导入
- 多线程实现大批量数据导入
- 批处理Excel数据导入为ArcGIS的shp点数据
- 数据导入导出工具BCP
- 算法基础(转载)
- Sublime Text 3技巧:支持GB2312和GBK编码
- JAVA线程同步
- ICCV2017论文分类
- jmap -heap 命令
- 多线程 批处理 数据导入工具 Java
- STL常用算法: distance实现,count_if算法实现,bind2nd的使用..
- 阶段性困惑_1
- 禅道使用方法-测试使用
- 进程
- 用UML建模开发嵌入式软件
- hihocoder 1038(01背包)
- 事项
- 俏丽的草丛之实习日志一