一直比较喜欢世界之窗的皮肤,现在虽然转移使用了谷歌浏览器,但还保留着世界之窗的皮肤,作为纪念,也希望世界之窗浏览器能继续发展下去。下载:http://www.everbox.com/f/ooqnonGNa4vTLAjOJhI1CDzbsT目前网盘使用的盛大的;115的很好用,缺点是有时间限制。dbank的广告多的一大堆,更多时候还需要登陆,才能下载。新浪的v盘,也是需要登陆才可以下载的。百度网盘不能指定单一文件共享,暂时还是盛大的everbox好用一些。
代码的使用性很强的啊! 让我们看看如何使用JDBC API在Java中执行批量插入。虽然你可能已经知道,但我会尽力解释基础到复杂的场景。在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据。此外,我们将努力探索一些场景,如在内存不足时正常运行,以及如何优化批量操作。首先,使用Java JDBC基本的API批量插入数据到数据库中。Simple Batch - 简单批处理我把它叫做简单批处理。要求很简单,执行批量插入列表,而不是为每个INSERT语句每次提交数据库,我们将使用JDBC批处理操作和优化性能。想想一下下面的代码:Bad Code[java]String [] queries = { insert into employee (name, city, phone) values ('A', 'X', '123'), insert into employee (name, city, phone) values ('B', 'Y', '234'), insert into employee (name, city, phone) values ('C', 'Z', '345'), }; Connection connection = new getConnection(); Statement statemenet = connection.createStatement(); for (String query : queries) { statemenet.execute(query); } statemenet.close(); connection.close(); [/java]这是糟糕的代码。它单独执行每个查询,每个INSERT语句的都提交一次数据库。考虑一下,如果你要插入1000条记录呢?这是不是一个好主意。 下面是执行批量插入的基本代码。来看看:Good Code[java] Connection connection = new getConnection(); Statement statemenet = connection.createStatement(); for (String query : queries) { statemenet.addBatch(query); } statemenet.executeBatch(); statemenet.close(); connection.close();[/java]请注意我们如何使用addBatch()方法,而不是直接执行查询。然后,加入所有的查询,我们使用statement.executeBatch()方法一次执行他们。没有什么花哨,只是一个简单的批量插入。 请注意,我们已经从一个String数组构建了查询。现在,你可能会想,使其动态化。例如:[java] import java.sql.Connection; import java.sql.Statement; //... Connection connection = new getConnection(); Statement statemenet = connection.createStatement(); for (Employee employee: employees) { String query = "insert into employee (name, city) values(' + employee.getName() + ',' + employee.getCity + '); statemenet.addBatch(query); } statemenet.executeBatch(); statemenet.close(); connection.close();[/java]请注意我们是如何从Employee对象中的数据动态创建查询并在批处理中添加,插入一气呵成。完美!是不是?等等……你必须思考什么关于SQL注入?这样动态创建的查询SQL注入是很容易的。并且每个插入查询每次都被编译。 为什么不使用PreparedStatement而不是简单的声明。是的,这是个解决方案。下面是SQL注入安全批处理。SQL Injection Safe Batch - SQL注入安全批处理思考一下下面代码:[java] import java.sql.Connection;import java.sql.PreparedStatement;//...String sql = "insert into employee (name, city, phone) values (?, ?, ?);;Connection connection = new getConnection();PreparedStatement…
计划是把工作中遇到的一些典型的问题,做个问题总结,之前遇到的,找时间来写。先把今天遇到的一个问题分析下问题场景: 是项目中有一块的程序数据处理变慢了,而且,现象是中午有变慢,下午的时候,就会趋于正常。查看日志也没有发现出现错误。过程分析: 程序流程: 问题分析: 现象是表2的数据插入很慢。 分析问题有两点可能出问题, 一个是在读取q1,做数据封装,数据逻辑处理给变慢了; 另外一个是在做删除表1的时候,删除的慢了; 最后分析的是排除了第一种原因,因为这一步简单,在实际中也就是服务器进行一下交互,服务器和网关都是足够健壮的。 定位在第二种情况,原因是删除表1 和 插入表2是个串行的操作。表1每天中午都会做大量的插入操作,在程序流程处理中也同时在做更新、删除的操作,对表的压力巨大,当删除操作变慢了,同样就影响了对表2的插入,导致插入表2的操作变慢,这样的后果,q2的队列存储容量也长时间处于饱和状态,存入Q2也随之延后,读取Q1,封装数据的逻辑处理也延后了,当然Q1的容量也饱和了,第一步的操作也变慢了。 最终的结果就是整个数据处理都变慢了。 解决办法: a、将表1的删除和表2的插入进行异步操作 b、对表1的不做删除,将表1的删除做记录id的操作,每天晚上定时进行删除。
import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Set;public class TestSet { public static void main(String[] args) { List list = new ArrayList(); list.add("zhaopeng"); list.add("zhaopeng"); list.add("zhaopeng"); list.add("momo"); list.add("momo"); list.add("momo"); for (Iterator iterator = list.iterator(); iterator.hasNext();) { String object = (String) iterator.next(); System.err.println(object); } System.err.println("----------------------"); List newList = TestSet.removeList(list); for (Iterator iterator = newList.iterator(); iterator.hasNext();) { String object = (String) iterator.next(); System.err.println(object); } } public static List removeList(List list) { Set someList = new HashSet(list); List newList = new ArrayList(); for (Iterator iterator = someList.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); newList.add(object); } return newList; }}