`

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连接postgresql数据库(源码+jar包)

    6. **关闭资源**:使用完毕后,记得关闭ResultSet、Statement和Connection,避免资源泄露。 在提供的jar包中,`postgresql-jre8.jar`或类似的文件包含了PostgreSQL JDBC驱动的所有类,它允许Java程序与PostgreSQL...

    JDBC数据库连接测试

    6. **关闭资源**:在完成数据库操作后,记得关闭ResultSet、Statement和Connection。 ### 3. CRUD操作 JDBC支持对数据库的基本CRUD(Create、Read、Update、Delete)操作: - **创建(Create)**:使用`...

    jdbc连接各种数据库方式

    - 关闭资源:最后,确保关闭ResultSet、Statement和Connection以释放系统资源。 2. **JDBC连接各种数据库方式** - MySQL:使用MySQL Connector/J驱动,配置URL通常为`jdbc:mysql://localhost:3306/your_database?...

    jdbc连接大全 jdbc连接大全,很有用的,经自己精心总结!!

    - **JDBC API**: 包含一系列的接口和类,如`java.sql.DriverManager`, `java.sql.Connection`, `java.sql.Statement`, `java.sql.PreparedStatement`等,它们提供了与数据库进行交互的方法。 - **驱动管理器**: `...

    jdbc连接mysql工具类

    总之,`jdbc连接mysql工具类`主要涉及JDBC API的使用,包括数据库连接、预编译的SQL语句(PreparedStatement)、结果集处理以及资源管理。这个工具类可以极大地简化数据库操作,提高代码的可维护性和复用性。通过...

    jdbc连接不同数据库方法

    6. **关闭资源**:完成操作后,记得关闭`ResultSet`、`Statement`和`Connection`,以释放系统资源。 博客链接中提到的iteye博客可能详细介绍了这些步骤,并提供了示例代码,演示了如何连接MySQL、Oracle、SQL ...

    MySQL jdbc连接器 jdbc.zip

    6. 关闭资源:操作完成后,务必关闭ResultSet、Statement和Connection,释放数据库资源。 MySQL JDBC连接器在不同版本间的差异主要体现在对新特性、性能优化和兼容性的支持上。例如,从5.x到8.x,MySQL引入了窗口...

    JDBC连接Mysql数据库案例

    执行完数据库操作后,记得关闭`ResultSet`、`Statement`和`Connection`,以释放系统资源。通常使用`try-with-resources`语句块确保资源的正确关闭。 7. **两个表的操作**: 在这个案例中,我们有两张表,可能需要...

    jdbc连接测试项目

    - 关闭资源:最后关闭ResultSet、Statement/PreparedStatement及Connection对象,释放系统资源。 在“jdbc连接测试项目”中,你可以看到以下关键步骤的代码示例: - 加载驱动:`Class.forName(...

    jdbc 连接各种数据库

    6. 关闭资源:在操作完成后,确保关闭Statement、ResultSet和Connection,以释放系统资源。 描述中的“NULL”表示没有提供具体的信息,但通常在学习JDBC时,我们可能会关注以下主题: - 数据库URL格式:不同的...

    JDBC连接数据库代码大全

    6. 关闭所有的资源(ResultSet、Statement和Connection)以防止内存泄漏。 值得注意的是,使用PreparedStatement可以有效防止SQL注入攻击,因为它允许预编译SQL并用参数替换动态内容,确保了安全性。同时,关闭不再...

    达梦数据库jdbc连接

    6. 关闭资源:使用完数据库连接后,记得关闭`ResultSet`、`Statement`和`Connection`,避免资源泄漏。 除了基本的JDBC操作,达梦数据库还提供了诸如事务管理、预编译语句、批处理等功能,这些都可以通过JDBC接口...

    JDBC连接sqlserver与mysql

    6. **关闭资源**:使用完毕后,记得关闭`ResultSet`、`Statement`和`Connection`,避免资源泄露。 接下来,我们转向MySQL。MySQL是一款开源、免费的关系型数据库,它同样支持JDBC连接。 1. **获取JDBC驱动**:...

    jdbc连接数据库步骤

    例如,若要连接MySQL数据库,则需要加载MySQL的JDBC驱动类,代码如下: ```java Class.forName("com.mysql.jdbc.Driver"); ``` 这段代码会尝试加载指定的类,并创建该类的一个实例。如果指定的类不存在,或者找...

    JDBC连接所有代码

    - **驱动程序**: JDBC驱动是Java应用程序和数据库之间的桥梁,主要有四种类型的驱动:JDBC-ODBC桥接驱动、网络纯Java驱动、协议纯Java驱动和Java数据库连接API驱动。 - **数据库URL**: 用于定位数据库服务器,如`...

    Java使用Jdbc连接Oracle执行简单查询操作示例

    Java使用Jdbc连接Oracle执行简单查询操作示例 Java使用Jdbc连接Oracle执行简单查询操作,是指使用Java语言通过Jdbc(Java ...通过本文,读者可以了解Java中Jdbc连接Oracle数据库的基本步骤和防止SQL注入的方法。

    JDBC Connection Configuration.rar

    连接池在应用启动时预创建一定数量的连接,应用程序需要时可复用这些连接,用完后归还,避免频繁的打开和关闭连接。 ### 5. 配置参数 配置JDBC连接通常涉及以下参数: - **URL**:数据库的统一资源定位符,包含...

    OracleJDBC连接类

    5. 关闭资源:在完成数据库操作后,记得关闭 `ResultSet`、`Statement` 和 `Connection` 对象,避免资源泄露。 `dbhelper` 文件可能是用于封装这些步骤的数据库帮助类,通常包含数据库连接池管理、SQL 执行等常用...

    JDBC连接数据库经验总结

    - **关闭资源**:使用完后,按顺序关闭`ResultSet`、`Statement`和`Connection`,避免资源泄露。 ### 3. 数据库连接池 在实际项目中,为了提高性能和资源利用率,通常会使用数据库连接池,如Apache的DBCP、C3P0,...

Global site tag (gtag.js) - Google Analytics