0

私のプログラムは、クラッシュすることなく常にDBテーブルへの挿入を停止します。これが私のコードです

データソースと接続の作成:

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プログラムの後は、他に何も実行せず、永久にビルドします。これが破損する可能性がある理由はありますか?ありがとう

4

1 に答える 1

2

このメソッドcreateTables()は、データベースへの接続(およびトランザクション)を作成します。ハングするコードは、2番目の接続(およびトランザクション)を作成します。2番目のトランザクションは、最初のトランザクションがコミットされるまでブロックされます。これは、両方が同じテーブルにロックされているためです。

con.commit();最後に呼び出すとcreateTables()、問題が解決するはずです。

于 2013-03-26T14:19:08.103 に答える