Thread: DDL hanging when different connection is left open
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
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
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