`

jdbc连接一定要关闭connection, resultset和preparedstatement

阅读更多

今天写了个程序往数据库插入100万条记录,代码如下

public static void insertRecords() throws Exception {
        Connection conn = null;
        try {
            conn = DBUtil.getConnection();
            conn.setAutoCommit(false);
                      
            while (count < TOTALNUM) {
                PreparedStatement ps = conn.prepareStatement("select * from custfund limit ?");
                ps.setInt(1, COPYNUM);
                ResultSet rs2 = ps.executeQuery();
                while (rs2.next() && count < TOTALNUM) {
                    PreparedStatement ps2 = conn
                            .prepareStatement("sql here...");
                    ps2.setInt(1, ++maxCustId);
                    ps2.setFloat(2, rs2.getFloat(2));
                    ps2.setFloat(3, rs2.getFloat(3));
                    ps2.setFloat(4, rs2.getFloat(4));
                    ps2.setFloat(5, rs2.getFloat(5));
                    ps2.setFloat(6, rs2.getFloat(6));
                    ps2.setFloat(7, rs2.getFloat(7));
                    ps2.setInt(8, rs2.getInt(8));
                   
                    ps2.executeUpdate();
                    ps2.close();
                    count++;
                    if (count % 2000 == 0) {
                        System.out.println(count);
                        long curtime = new Date().getTime();
                        long timeUsed = curtime - time;
                        int remaincount = TOTALNUM - count;
                        System.out.println("remaining time:" + (remaincount / 2000) * timeUsed / 1000 + "s");
                        time = curtime;
                        conn.commit();
                    }
                }
                rs2.close();********
                ps.close();********
            }
            System.out.println("total time:" + (new Date().getTime() - starttime) / 1000 + "S");
        } finally {
            if (conn != null) {
                conn.close();
            }
        }
    }

 

在****处如果不对rs, ps close,就会有java虚拟机out of memory.

按理说java虚拟机会自动垃圾回收,但为什么这里会这样呢?

原因是rs, ps没有关闭,java虚拟机认为它还在被使用。很多循环以后,就内存满了。

分享到:
评论

相关推荐

    jdbc连接数据库getConnection 增、删、改、查

    SqlHelper.java连接数据库通用类... package org.jdbc.com.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql....

    JDBC连接所有数据库步骤

    JDBC连接所有数据库步骤 1 将数据库的JDBC驱动加载到classpath中,在基于JAVAEE的WEB应用实际开发过程中,通常要把目标...7 依次将ResultSet、Statement、PreparedStatement、Connection对象关闭,释放所占用的资源。

    JDBC连接数据库

    JDBC连接数据库,里面有封装好的Connection、PreparedStatement、ResultSet,连接数据库和关闭这三种连接可以直接调用,简洁化!

    Java-JDBC【源码】JDBC概述、获取连接、SQL注入问题与解决、查询解析

    7.关闭连接 `ResultSet 、Statement 、Connection` 3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2.PreparedStatement解决 3.3.Statement 与 PreparedStatement 4.完整源码

    JDBC详解HTML-JDBC.pp

    1、JDBC(Java Database Connection):java连接数据库统一接口API,底层主要通过直接的JDBC驱动和 JDBC-ODBC桥驱动实现与数据库的连接。 1&gt;.JDBC驱动程序类型: &lt;1&gt;.JDBC-ODBC桥加ODBC驱动程序:需要ODBC驱动,适合...

    JDBC笔记 JDBC笔记

    java.sql.Connection 与特定数据库的连接(会话)。能够通过getMetaData方法获得数据库提供的信息、所支持的SQL语法、存储过程和此连接的功能等信息。代表了数据库。 java.sql.Driver 每个驱动程序类必需实现的...

    jdbcJDBC主要接口、类

    JDBC主要接口、类: Connection:封装连接 DriverManager:管理驱动 Statement:封装SQL语句 PreparedStatement:封装SQL语句 ResultSet:封装结果集

    Java JDBC.pptx

    掌握JDBC操作数据库的步骤 熟悉JDBC的常用API 了解什么是JDBC DriverManager类、Connection接口、Statement接口 连接mysql数据库方法 PreparedStatement接口 ResultSet接口

    JDBC 访问数据的步骤

    Connection接口,ResultSet接口,PreparedStatement接口

    数据库-数据库编码解决方案

    我们知道进行编码和转码工作都是集中在JDBC的两个接口PreparedStatement和ResultSet上进行的,主要涉及PreparedStatement的setString方法以及ResultSet的getString方法。前面我们讲过需要加入一个连接封装层来对...

    JDBC(powernode CD2206)详尽版 (教学视频、源代码、SQL文件)

    二、JDBC常用的接口和类 2.1 Driver接口 2.2 DriverManager类 2.3 Connection接口 2.4 Statement接口 2.5 PreparedStatement接口 2.6 ResultSet接口 2.7 DataSource接口 三、JDBC操作数据库的步骤 四、编写第一个...

    JDBC相关单元测试及通用的Dao

    jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。

    jdbc基础和参考

    所以如果一旦连接关闭那么ResultSet将取不到值 5.处理结果 如果有结果集,处理结果集 ResultSet next(),每执行一次,向下移动一次,如果有值,返回true,如果没值返回false while(rs.next()){ rs.getType...

    采用JDBC进行数据库分页查询

    一次只从数据库中查询最大maxCount条记录 ... PreparedStatement pstat = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); //最大查询到第几条记录.........

    JDBC访问数据库的步骤

    JDBC访问数据库的步骤 1. 新建java项目:JDBC,新建 class文件:TestJDBC 2. JDBC用到的类库基本都位于java.sql.*包中,程序中引入该包: Import java.sql.*; 3. 添加要用的数据库中的包,找到数据库中的Driver....

    Java连接数据库并修改内容.rar

    Java连接数据库并修改内容,Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动器  Connection con=DriverManager.getConnection(dbURL,user,password); //获取连接  String sqlStr="select * from ...

    连接数据库

    public static void closeConn(ResultSet rs, Connection conn, PreparedStatement pstm) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { System.out.println("rs关闭异常!"); }...

    JDBC_MVC个人笔记.md

    JDBC/MVC个人笔记: MVC; 了解三个类的作用:Connection,PreparedStatement,ResultSet; 代码:UserDao.java、DBUtil.java

    JDBC.txt是链接mysql数据库的源码,复制粘贴即可,需要mysql.jar包

    Connection conn= DriverManager.getConnection(url,"root","123456"); //创建语句对象 String sql="select *from good"; PreparedStatement ptmt=conn.prepareStatement(sql); ResultSet rs= ptmt....

    数据库增删改查的源代码

    //连接mysql数据库,要先把mysql的jdbc驱动放到工程的WEB-INF/lib包里面。 public static Connection createConn() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = ...

Global site tag (gtag.js) - Google Analytics