현재 JDBC를 사용하여 filemaker pro 11에서 MySQL로 데이터를 전송하려고합니다.Java에서 데이터베이스 마이그레이션 도구 작성, 메모리 문제 (코드 구조)
각각에 대한 연결 설정을 다루었으며 쿼리가 작동하고 MySQL에 안전하게 데이터를 삽입했습니다.
try {
results =
query.executeQuery("SELECT \"field one\", \"field two\" from table");
Connection con = DriverManager.getConnection("jdbc:mysql://website.com/database","user","password");
// Iterate through the results and print them to standard output
while (results.next()) {
String fname = results.getString("field one");
String lname = results.getString("field two");
System.out.println("Found user \"" + fname + " " + lname + "\"");
stmt = con.prepareStatement("INSERT ignore INTO table (idtable, name) values (?, ?)");
// some of the data I've been provided with is pretty horrific,
// so inserting safely is of large concern.
stmt.setString(1, fname);
stmt.setString(2, lname);
stmt.executeUpdate();
}
}
catch (SQLException e) {
System.out.println("Error retrieving data from database.");
e.printStackTrace();
//System.exit(1);
}
이 작은 테이블 (~ 4 분에 10 만 개 기록)에 대한 괜찮 작동하지만 이들 중 일부는 매우, 매우 큰이며 :(응용 프로그램에 충돌이 원인이됩니다.
이 할 수 있어야합니다 적어도 한 번 실행하여 전체 채우기를 수행해야하지만 그 이후에는 지난 주에 변경된 내용을 가져올 출력을 제한 할 수 있습니다.
이전에이 내용을 VB.net에 작성하고 큰 삽입을 구성했지만, ve는 스위치를 만들었고 현재 데이터베이스에는 모든 종류의 미친 캐릭터가 있기 때문에 준비 문이 필요합니다.
감사합니다, 폴 S는
Error:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:151)
at java.lang.StringCoding.decode(StringCoding.java:191)
at java.lang.String.<init>(String.java:451)
at java.util.jar.Attributes.read(Attributes.java:401)
at java.util.jar.Manifest.read(Manifest.java:199)
at java.util.jar.Manifest.<init>(Manifest.java:69)
at java.util.jar.JarFile.getManifestFromReference(JarFile.java:182)
at java.util.jar.JarFile.getManifest(JarFile.java:163)
at sun.misc.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:710)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:238)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:435)
at com.mysql.jdbc.PreparedStatement.getInstance(PreparedStatement.java:872)
at com.mysql.jdbc.ConnectionImpl.clientPrepareStatement(ConnectionImpl.java:1491)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4250)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4149)
at datasync2.FMProConnection.companyQuoteInsert(FMProConnection.java:686)
at datasync2.DataSync2View.jButton1ActionPerformed(DataSync2View.java:220)
at datasync2.DataSync2View.access$800(DataSync2View.java:22)
at datasync2.DataSync2View$4.actionPerformed(DataSync2View.java:124)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)
at java.awt.Component.processMouseEvent(Component.java:6268)
당신은'con.prepareStatement()'호출을 루프 외부로 옮겨 보았습니까? 매번 새로운 PreparedStatement를 만들 필요가 없습니다. 매개 변수를 설정하고 실행하면됩니다. –
내가 당신이라면 나는 [Spring Batch] (http://static.springsource.org/spring-batch/)를 사용할 것이다. 이를 염두에두고 시나리오를 작성하고 재시작, 트랜잭션 일괄 처리 및 기타 여러 가지 유용한 기능을 지원합니다. –