黑马程序员技术交流社区

标题: 怎么样才可以调数据库的写入效率 [打印本页]

作者: 张绍成    时间: 2011-12-23 21:18
标题: 怎么样才可以调数据库的写入效率
本帖最后由 tianshan20081 于 2011-12-25 15:32 编辑

今天找到一的200多M的txt 文件。文件格式表规范。
代码:
  1. public static void main(String[] args) throws IOException {
  2.                
  3.         BufferedReader br = new BufferedReader(new InputStreamReader(new
  4. FileInputStream("D:\\TDDownload\\XXX.sql")));
  5.         String text ;
  6.         int i = 0 ;
  7.         System.out.println(new Timestamp(System.currentTimeMillis()));
  8.         while((text = br.readLine())!= null){

  9.                   String[] ss= text.split("#");

  10.                   User u = new User();
  11.                   u.setUsername(ss[0].trim());
  12.                   u.setPassword(ss[1].trim());
  13.                   u.setEmail(ss[2].trim());
  14.                   
  15.                   UserDao ud = new UserDao();
  16.                   ud.addUser(u);
  17.                   i++ ;
  18.                   
  19.         }
  20.         System.out.println(i);
  21.         System.out.println(new Timestamp(System.currentTimeMillis()));

  22.         }
复制代码
  1. public void addUser(User u){
  2.                 Connection conn = DBUtil.getconn();
  3.                 PreparedStatement ps = null ;
  4.                 String sql = "insert into tb_csdnuser(username,password,email) values(?,?,?)";
  5.                 try {
  6. //                        System.out.println(u.getUsername()+"#"+u.getPassword()+"#"+u.getEmail());
  7.                        
  8.                         ps = conn.prepareStatement(sql);
  9.                         ps.setString(1, u.getUsername());
  10.                         ps.setString(2, u.getPassword());
  11.                         ps.setString(3, u.getEmail());
  12.                         ps.execute();
  13.                        
  14.                         DBUtil.commit(conn);
  15.                 } catch (SQLException e) {
  16.                         DBUtil.rollback(conn);
  17.                         // TODO Auto-generated catch block
  18.                         e.printStackTrace();
  19.                 }finally{
  20.                         DBUtil.closeConn(conn);
  21.                         DBUtil.closePS(ps);
  22.                 }
  23.                
  24.         }
复制代码
都写了好几个小时了 还没写完!  
我的代码有哪些地方可以提高效率!
作者: 张乐乐    时间: 2011-12-24 09:09
一次只执行一条语句、这对于处理大量更新命令的效率不高、JDBC 2引入的批更新方式用于处理非select的命令、将这些命令都搜集起来、一起执行。
  1. //add SQL commands to the batch
  2. statement.addBatch("insert into test values (1,'smith');
  3. statement.addBatch("insert into test values (1,'smith');
  4. //Execute the batch
  5. int count[] = statement.executeBatch();
复制代码
如果真要用批处理、还要判断你的驱动程序是否支持批更新、MySql Access Oracle JDBC驱动器都支持的。
  1. connection.getMetaData().supportsBatchUpdates()
复制代码
判断是否可以支持批更新
--------------------------------------------------------------------华丽丽的分割线---------------------------------------------------------------
那么对于这600万的数据、那么一句一句的添加将会浪费很多时间。
对于你的这段、除了需要用批更新外、还需要优化的不要都输出一遍吧、哥们、600万啊。我感觉这输出没必要了吧。还有就是你没添加一个信息就关闭了连接、然后下次就是重新连接。这样也很浪费时间的。

作者: 冯瑞君老师    时间: 2011-12-24 15:00
写个dao类,把jdbc封装了,每次用的时候调用它,会减少很多的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2