From: <leg...@at...> - 2003-10-12 17:24:21
|
Message: The following issue has been closed. Resolver: Gavin King Date: Sun, 12 Oct 2003 12:23 PM Hibernate does not have any memory leaks. Please do not report these kind of problems here. We have a user forum! --------------------------------------------------------------------- View the issue: http://opensource.atlassian.com/projects/hibernate/secure/ViewIssue.jspa?key=HB-386 Here is an overview of the issue: --------------------------------------------------------------------- Key: HB-386 Summary: Hibernate crashes while populate large tables Type: Bug Status: Closed Priority: Major Resolution: REJECTED Project: Hibernate2 Components: core Versions: 2.1 2.0.3 Assignee: Reporter: Jeff Gager Created: Wed, 8 Oct 2003 6:18 AM Updated: Sun, 12 Oct 2003 12:23 PM Environment: Dell 2Ghz Pentium 4 512MB RAM Running Windows XP. Java 1.4.2 Eclipse 2.1.1 Description: I am trying to write a simple java application that reads a large number of records from a Oracle database (using JDBC) and loads them into a mySQL database through hibernate. The application crashes with java.lang.OutOfMemoryError. As the application runs I can see it steadilly using up memory until it eventually falls over. I am commiting the Transaction, closing the Session and creating a new Session and Transaction every 1000 records. I think hibernate is either failing to release some kind of resource, or it is performing some action on the existing data before creating each record which is consuming more memory as more records are created. I am not sure how to proceed, your help would be much appreciated. Source follows; package X lots of import's public class XLoader { private static Logger log = Logger.getLogger("X.XLoader"); public static void main(String[] args) throws Throwable { log.info("Processing starting at " + new Date()); Connection conn = null; try { // Create the JDBC Driver final OracleDriver driver = new OracleDriver(); // Load the Oracle JDBC driver DriverManager.registerDriver(driver); // Establish Read-only JDBC Connection to the PAS database conn = (Connection)DriverManager.getConnection("jdbc:oracle:oci8:@XXX", "XXX", "XXX"); conn.setAutoCommit(false); // Loading... loadPerson(conn); log.info("Processing completed at " + new Date()); } catch (Throwable e) { log.fatal("Unhandled Exception - processing halted\n" + e.toString()); throw e; } finally { conn.close(); System.exit(1); log.info("Finished at " + new Date()); } } private static void loadPerson(Connection conn) throws Throwable { log.info("Processing people at " + new Date()); // Declare statment and result set PreparedStatement stmt = null; ResultSet rset = null; Session session = null; Transaction tx = null; SessionFactory sf = new Configuration().configure("/XX.xml").buildSessionFactory(); try { // Load people String sql = "BIG SELECT STATEMENT HERE"; log.info("Reading people at " + new Date()); stmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rset = stmt.executeQuery(); if (rset.getFetchSize() < 1) throw new SQLException("No People found"); session = sf.openSession(); tx = session.beginTransaction(); log.info("Loading people at " + new Date()); int counter = 0; String lastPayroll = ""; Payroll payroll = null; while (rset.next()) { // Create new payrolls as we find them String thisPayroll = rset.getString(1); if (!thisPayroll.equals(lastPayroll)) { payroll = new Payroll(); payroll.setName(rset.getString(1)); payroll.setFrequency(rset.getString(2)); payroll.setStatus(rset.getString(3)); payroll.setFirstPaydate(rset.getDate(4)); payroll.setNextPaydate(rset.getDate(5)); payroll.setPrevPaydate(rset.getDate(6)); payroll.setRunDate(rset.getDate(7)); payroll.setAccountName(rset.getString(8)); payroll.setAccountNumber(rset.getInt(9)); payroll.setSortcode(rset.getInt(10)); payroll.setBacsName(rset.getString(11)); payroll.setBacsNumber(rset.getInt(12)); ArrayList payrollMemberships = new ArrayList(); payroll.setMemberships(payrollMemberships); session.save(payroll); } lastPayroll = thisPayroll; // Create people Person person = new Person(); person.setReference(rset.getString(13)); person.setSurname(rset.getString(14)); person.setSex(rset.getString(15).charAt(0)); person.setForenames(rset.getString(16)); person.setInitials(rset.getString(17)); person.setTitle(rset.getString(18)); person.setNiNumber(rset.getString(19)); person.setBirth(rset.getDate(20)); ArrayList personMemberships = new ArrayList(); person.setMemberships(personMemberships); ArrayList personAddresses = new ArrayList(); person.setAddresses(personAddresses); session.save(person); // Create memberships Membership membership = new Membership(); membership.setStart(rset.getDate(21)); membership.setStatus("Paying"); membership.setPerson(person); membership.setPayroll(payroll); person.addMembership(membership); payroll.addMembership(membership); session.save(membership); // Create addresses Address address = new Address(); address.setStart(new Date()); address.setLine1(rset.getString(22)); address.setLine2(rset.getString(23)); address.setTown(rset.getString(24)); address.setCounty(rset.getString(25)); address.setPostcode(rset.getString(26)); address.setPerson(person); person.addAddress(address); session.save(address); if ((++counter % 1000) == 0) { tx.commit(); long payid = payroll.getId().longValue(); session.close(); session = sf.openSession(); tx = session.beginTransaction(); payroll = (Payroll)session.load(Payroll.class, new Long(payid)); log.info("Loaded " + counter); } } tx.commit(); session.close(); sf.close(); log.info("Total People Loaded " + counter); rset.close(); stmt.close(); // Handle errors } catch (Throwable e) { log.fatal(e.getMessage(), e); rset.close(); stmt.close(); if (sf != null) sf.close(); if (session != null) session.close(); if (tx != null) tx.rollback(); throw e; } log.info("Finished processing people at " + new Date()); } } --------------------------------------------------------------------- JIRA INFORMATION: This message is automatically generated by JIRA. If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa If you want more information on JIRA, or have a bug to report see: http://www.atlassian.com/software/jira |