我正在尝试使用JDBC将数据从filemaker pro 11传输到MySQL。
我已经处理过设置与每个连接的连接,并且查询有效,并将数据安全地插入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分钟内约100,000条记录),但其中一些非常非常大并导致应用程序崩溃:(。
这需要能够至少运行一次以完成一个完整的人口,但之后我可以限制输出以获取上周所做的更改。
我之前在VB.net中写过这个,并且构造了大型插入,但是我做了一个切换 - 我真的需要那个prepare语句,因为当前数据库中有各种各样的疯狂字符。
谢谢,Paul 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)
答案 0 :(得分:1)
您可能需要使用其他FileMaker JDBC驱动程序。我不认为FileMaker提供的JDBC驱动程序支持流式结果集,这意味着它将所有数据加载到内存中。
如果您愿意,可以在http://java.net/projects/woof/尝试我们的FileMaker JDBC驱动程序。它比FileMaker提供的驱动程序慢一点,因为它运行在(缓慢的)XML Web Publishing界面上,但它会传输结果,因此不应该耗尽内存。
答案 1 :(得分:0)
PreparedStatement是要走的路;不用担心。
我必须看到描述崩溃的异常才知道根本原因是什么,但我的猜测是你试图一次插入太多记录。我将它分解成更小的块,并在我作为单个事务进行时提交每个块。您的事务日志不必包含每个INSERT。
答案 2 :(得分:0)
也许这样可以解决问题:
//...
stmt.executeUpdate();
stmt.close();
//...
(明确发布声明,而不是等待GC为你做这件事)
答案 3 :(得分:0)
在批次中执行此操作。 您可以从批量大小100K开始并增加它直到性能下降。
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')");
stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')");
int[] insertCounts = stmt.executeBatch();
喜欢这里http://download.oracle.com/javase/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html
循环1-4,直到源表中的所有记录都已成功处理。