【问题标题】:inserting into database in java with prepareStatement使用prepareStatement在java中插入数据库
【发布时间】:2013-03-26 13:55:01
【问题描述】:

我的程序总是在插入数据库表时停止而不会崩溃。这是我的代码

创建数据源和连接:

public void setUp() throws Exception {
    manager = new IngredientManager();
    BasicDataSource ds = new BasicDataSource();
    ds.setUrl("jdbc:derby:memory:ingredient;create=true");       
    manager.setDataSource(ds);
    manager.createTables();
}

方法createTables():

public void createTables() throws ServiceFailureException, SQLException {
   Connection con = dataSource.getConnection();
   con.setAutoCommit(false);
   String createTableSQL = "CREATE TABLE INGREDIENTS("
           + "ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, "
           + "NAME VARCHAR(255), "
           + "AMOUNT DOUBLE, "
           + "UNIT VARCHAR(255), "
           + "RECIPEID INTEGER NOT NULL "
           + ")";

   PreparedStatement query = con.prepareStatement(createTableSQL);
   query.executeUpdate();
}

这一切正常,但是当程序涉及到这个时:

Connection connection = dataSource.getConnection();
connection.setAutoCommit(false);
query = connection.prepareStatement("INSERT INTO INGREDIENTS (NAME, AMOUNT, UNIT, RECIPEID) VALUES(?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);

在connection.prepareStatement 程序之后不做任何其他事情,只是永远构建。任何想法为什么这可能会被破坏?谢谢

【问题讨论】:

  • 你说的永久建造是什么意思?如何验证以下代码从未执行?
  • 我在方法 query = connection.prepareStatement(..) 上有断点,在此之后的方法上有断点,程序永远不会到达第二个断点
  • 删除第一个断点。现在可以联系到另一个吗?
  • connection.setAutoCommit(false); - 将到达 query = connection.prepareStatement(...); - 将到达另一个方法(); - 不会到达
  • 尝试在createTables()末尾调用con.commit();

标签: java prepared-statement derby


【解决方案1】:

createTables() 方法创建到数据库的连接(和事务)。 挂起的代码创建了第二个连接(和事务)。第二个事务被阻塞,直到第一个事务被提交,因为它们都锁定在同一个表上。

createTables() 末尾调用con.commit(); 应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多