Обсуждение: DDL hanging when different connection is left open

Поиск
Список
Период
Сортировка

DDL hanging when different connection is left open

От
Nathan McEachen
Дата:
In order to execute a DDL statement  on  a table using a JDBC
connection, must all other JDBC connections that have performed a read
query on that table be closed?

This is what I am seeing:

connection1 performes query: "SELECT * FROM my_table";
connection 2 performs DDL: "ALTER TABLE my_table ADD COLUMN my_col INTEGER";


connection 2 seems to hang unless connection1 is closed (i.e.
conneciton1.close() ).

This is proving to be a problem when I pool my JDBC connections in my
application, as connections that are returned to the pool are not
closed. I tried chaning the transaction isolation levels through JDBC
but that did not change anything.

Is there a way for me to keep my JDBC connections open, yet still
perform DDL statements?

Thanks in advance,

-Nathan

--
In theory, there is no difference between theory and practice.  But, in practice, there is.

--Jan L.A. van de Snepscheut



Re: DDL hanging when different connection is left open

От
Oliver Jowett
Дата:
Nathan McEachen wrote:

> connection1 performes query: "SELECT * FROM my_table";
> connection 2 performs DDL: "ALTER TABLE my_table ADD COLUMN my_col
> INTEGER";
>
>
> connection 2 seems to hang unless connection1 is closed (i.e.
> conneciton1.close() ).

Most likely, connection 1 has autocommit off and you have forgotten to
commit or rollback the transaction that your SELECT opened.

-O

Re: DDL hanging when different connection is left open

От
Nathan McEachen
Дата:
Oliver Jowett wrote:

> Nathan McEachen wrote:
>
>> connection1 performes query: "SELECT * FROM my_table";
>> connection 2 performs DDL: "ALTER TABLE my_table ADD COLUMN my_col
>> INTEGER";
>>
>>
>> connection 2 seems to hang unless connection1 is closed (i.e.
>> conneciton1.close() ).
>
>
> Most likely, connection 1 has autocommit off and you have forgotten to
> commit or rollback the transaction that your SELECT opened.
>
Thanks, I *thought* I had checked that, being the thorough and diligent
person that I am.  :) However, I am using AspectJ on this project.  I
just figured out that  I had a faulty pointcut definition.  So this was
not a JDBC issue, rather a "Nathan better pay closer attention to how he
defines his pointcut advice" issue.  Basically some aspect advice was
preventing the connection from committing, hence connection 2 was hanging.

Sorry for the faulty post.


For all of you AOP people:

public abstract pointcut dumbNathanPosts();

Object around() : dumbNathanPosts()
{
  // just ignore what Nathan says.  Do not call proceed();
}


-Nathan


--
In theory, there is no difference between theory and practice.  But, in practice, there is.

--Jan L.A. van de Snepscheut