3

我正在尝试使用 JDBC 插入多个表。因为它必须要快我要使用PreparedStatementexecuteBatch方法。表由外键关系组合。

  • 第一个想法是使用getGeneratedKeys(),但某些 JDBC 驱动程序失败了。例如 PostgreSQL。

  • 第二个想法是使用 SQL-currval(...) 函数。但是必须为一个语句调用执行批处理,而另一个语句使所有键都具有相同的值。所以这个方法也失败了。

  • JDBC 不接受以分号分隔的插入。

我怎样才能做到这一点?

4

3 回答 3

1

您似乎主要使用 PostgreSQL。很高兴知道自从 PostgreSQL JDBC 驱动程序版本8.4-701以来PreparedStatement#getGeneratedKeys()功能齐全。

您只需要按如下方式准备语句即可使其返回键:

statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

因此,如有必要,请升级您的驱动程序并修复您准备语句的方式。顺便说一句,这也适用于许多其他 JDBC 驱动程序。


一个完全不同的替代方案是完全放弃普通的 JDBC 并进入一个抽象层并潜入“好”的 Hibernate 或现代 JPA。他们提供了一种纯面向对象的 Java 数据库实体处理方法,无需摆弄生成的键等。这一切都是在幕后透明地处理的,它们支持非常广泛的 DB 方言。

于 2011-03-03T04:08:50.520 回答
0

好的,这是我自己的答案。

只要供应商无法正确实现您需要的 getGeneratedKeys() 函数和特定于数据库的后备选项。

如果您需要非运动数据库的后备,使代码非常难看。

这是我对 Postgres 9.0 的解决方法:

  • 首先生成大量的密钥 "SELECT nextval('public.\"table_column_seq\"') FROM generate_series(1,"+pollsize+")");
  • 然后在所有准备好的批处理语句中分发这些密钥。

浪费了一整天的血腥时间,然后我得到的只是一个丑陋的解决方案。JDBC 应该在应用程序启动时检查驱动程序是否真的符合其预期,否则会抛出一些不可恢复的恶意 YouVeGotaF**ckedUpDriverException。

于 2011-03-02T18:10:12.420 回答
0

如果代码必须快速运行,那么您应该尝试编写一个存储过程/函数,它将接受将插入表中的值数组。

这是一个例子

于 2011-03-02T16:44:38.327 回答