使用连接池和缓存机制,处理连接数据库操作
2017-07-28 14:10
627 查看
因为最近在研究kettle,用到参数转换的功能,领导让用java代码写处理转换的功能,然后用kettle调用,发现如果java代码不做优化,4万多的数据,要6分钟左右才能跑完,以下是我代码的优化处理,处理完后,4万数据,11秒左右就抽取和处理完毕。因为我这现在没什么复杂的处理业务逻辑,大家可以参考看看
1.首先,创建转换的实体类
2,创建连接池和数据库的连接
3,使用缓存,把数据库读到的数据放到缓存里
1.首先,创建转换的实体类
package entity; public class Comparison { private String id; private String codetype; private String codename; private String newcode; private String newcodename; private String oldcode; private String oldcodename; private String filename; private String remark; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCodetype() { return codetype; } public void setCodetype(String codetype) { this.codetype = codetype; } public String getCodename() { return codename; } public void setCodename(String codename) { this.codename = codename; } public String getNewcode() { return newcode; } public void setNewcode(String newcode) { this.newcode = newcode; } public String getNewcodename() { return newcodename; } public void setNewcodename(String newcodename) { this.newcodename = newcodename; } public String getOldcode() { return oldcode; } public void setOldcode(String oldcode) { this.oldcode = oldcode; } public String getOldcodename() { return oldcodename; } public void setOldcodename(String oldcodename) { this.oldcodename = oldcodename; } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } }
2,创建连接池和数据库的连接
package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Vector; public class JdbcUtil { private static final Vector<Connection> pool = new Vector<Connection>(); private static final int MAX_SIZE = 50; private static final int MIN_SIZE = 10; private static Connection createConnection(){ Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection( "jdbc:mysql://192.168.4.143:3306/loan2","root","123456"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } static { for (int i = 0; i < MIN_SIZE; i++) { pool.add(createConnection()); } } public static synchronized Connection getConnection() { Connection conn = null; //conn = createConnection(); if (pool.isEmpty()) { conn = createConnection(); } else { int last_idx = pool.size() - 1; conn = (Connection) pool.get(last_idx); pool.remove(conn); } return conn; } public static synchronized void close(Connection conn) { if (pool.size() < MAX_SIZE) { pool.add(conn); } else { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
3,使用缓存,把数据库读到的数据放到缓存里
package transform; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import util.JdbcUtil; public class trans { public static void main(String[] args) { trans trans = new trans(); String code = trans.transCode("SEXCODE", ""); } static int num; static Map<String, Map<String, String>> paramTypeKeyValueMap = new HashMap<String, Map<String, String>>(); static Lock lock = new java.util.concurrent.locks.ReentrantLock();//同步,需要手动释放资源 public String transCode(String codetype, String oldcode) { num++; Thread.currentThread().setName("zhengxin" + num); if (oldcode == null) { return null; } Map<String, String> keyValue = paramTypeKeyValueMap.get(codetype); if (keyValue == null) { try { lock.lock();//获取锁 keyValue = paramTypeKeyValueMap.get(codetype); if (keyValue == null) { keyValue = load2Cache(codetype); } } finally { lock.unlock();// 释放锁 } } if (keyValue.get(oldcode) != null) { return keyValue.get(oldcode); } else { return oldcode; } } private Map<String, String> load2Cache(String codetype) { Map<String, String> keyValue = new HashMap<String, String>(); Connection conn = JdbcUtil.getConnection(); Statement stmt = null; try { stmt = conn.createStatement(); String sql = "select newcode,oldcode from comparison where codetype='" + codetype + "'"; ResultSet rs = stmt.executeQuery(sql); paramTypeKeyValueMap.put(codetype, keyValue); while (rs.next()) { String newcode = rs.getString(1); String oldc = rs.getString(2); if (oldc == null) { continue; } String[] codes = oldc.split(","); for (String s : codes) { if (s == null) { continue; } keyValue.put(s, newcode); } } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (stmt != null) { try { stmt.close(); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { JdbcUtil.close(conn); } } return keyValue; } }
相关文章推荐
- hibernate 使用连接池连接数据库时 自动断开处理
- 使用properties属性文件做连接数据库的操作代码
- 使用TransactionScope实现多数据库连接事务操作
- PHP使用数据库永久连接方式操作MySQL的是与非
- PHP使用数据库永久连接方式操作MySQL的是与非
- ASP中对数据库表的操作,可使用事务处理,并支持多事务处理
- 在ASP中使用事务处理数据库增/删/改操作
- 循环体内包含了大量没有必要在循环中处理的语句或获取数据库连接或进行不必要的try-catch操作
- PHP使用数据库永久连接方式(mysql_pconnect)操作MySQL的是与非
- PHP使用数据库永久连接方式操作MySQL的是与非
- PHP使用数据库永久连接方式操作MySQL的是与非
- 使用连接池的方式连接数据库:使用DBUtil连接MYSQL数据库
- Linux socket之四:使用POLL机制处理多连接
- C#ADO连接修改Paradox表时“操作必须使用一个可更新的查询”错误的处理办法
- 数据库连接中使用连接池(Pool)和不使用的比较!!
- 使用TransactionScope实现单数据库连接事务操作
- 使用TransactionScope实现多数据库连接事务操作
- JAVA Web 安全机制----使用filter验证session用户和页面缓存问题处理
- c#使用Transactions类完成多个数据库的事务操作(分布式事务处理)
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce