You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Mikael Hakman (JIRA)" <ji...@apache.org> on 2013/02/17 17:47:12 UTC

[jira] [Commented] (DERBY-6074) DatabaseMetaData.getTables not updated in multi thread multi connection application

    [ https://issues.apache.org/jira/browse/DERBY-6074?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13580207#comment-13580207 ] 

Mikael Hakman commented on DERBY-6074:
--------------------------------------

Sorry, it was my application which cached the data. I'm closing this issue. You may as well remove it. Sorry and thanks.
                
> DatabaseMetaData.getTables not updated in multi thread multi connection application
> -----------------------------------------------------------------------------------
>
>                 Key: DERBY-6074
>                 URL: https://issues.apache.org/jira/browse/DERBY-6074
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.9.1.0
>         Environment: Windows 8
>            Reporter: Mikael Hakman
>
> The test application creates two connections (connection1 and connection2) on a separate threads. Then connection2 on thrid thread is used to create a table which is then committed on the main thread. connection1 is rollbacked and closed on main thread. New connection (connection3) is created on a separate thread. Then this connection on the main thread is used to retrieve DatabaseMetaData which is then used to get list of tables (getTables()). The newly created table is not listed but it should because it was commited. I can verify that the table is there by using ij. Also when the test is run the second time it complains that the table cannot be created because it is allready there, Here is the test program listing. I'm sorry I could'nt make it smaller. Thanks.
> <pre>
> import java.sql.Connection;
> import java.sql.DatabaseMetaData;
> import java.sql.Driver;
> import java.sql.ResultSet;
> import java.sql.SQLException;
> import java.sql.Statement;
> import java.util.Properties;
> public class TestDerby {
> 	
> 	public static void main (String [] args) {
> 		
> 		try {
> 		
> 			new TestDerby ();
> 			
> 		} catch (Exception ex) {
> 			
> 			ex.printStackTrace ();
> 			
> 			System.exit (1);
> 		}
> 	}
> 	Connection connection1;
> 	Connection connection2;
> 	
> 	public TestDerby () throws InterruptedException, SQLException {
> 		
> 		ConnectThread connectThread = new ConnectThread ();
> 		
> 		connectThread.start ();
> 		
> 		connectThread.join ();
> 		
> 		this.connection1 = connectThread.connection;
> 		
> 		connectThread = new ConnectThread ();
> 		
> 		connectThread.start ();
> 		
> 		connectThread.join ();
> 		
> 		this.connection2 = connectThread.connection;
> 		
> 		CreateTableThread createTableThread = new CreateTableThread ();
> 		
> 		createTableThread.start ();
> 		
> 		createTableThread.join ();
> 		
> 		this.connection2.commit ();
> 		
> 		this.connection1.rollback();
> 		
> 		this.connection1.close ();
> 		
> 		connectThread = new ConnectThread ();
> 		
> 		connectThread.start();
> 		
> 		connectThread.join ();
> 		
> 		this.connection1 = connectThread.connection;
> 		
> 		this.checkForTable ();
> 	}
> 	
> 	public void checkForTable () throws SQLException {
> 		
> 		DatabaseMetaData dmd = this.connection1.getMetaData();
> 		
> 		ResultSet tables = dmd.getTables(null,null,"%",null);
> 		
> 		while (tables.next()) {
> 			
> 			String tableName = tables.getString ("TABLE_NAME");
> 			
> 			if (tableName.equals("testtab")) {
> 				
> 				String tableSchema = tables.getString ("TABLE_SCHEM");
> 				
> 				System.out.println ("Found table " + tableName + " in " + tableSchema);
> 			}
> 		}
> 		
> 		tables.close ();
> 	}
> 	
> 	public class ConnectThread extends Thread {
> 		
> 		Connection connection;
> 		
> 		public void run () {
> 			
> 			try {
> 			
> 				Class<?> driverClass = Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
> 				
> 				Driver driver = (Driver) driverClass.newInstance ();
> 				
> 				this.connection = driver.connect("jdbc:derby:testdb;create=true",new Properties());
> 				
> 				this.connection.setAutoCommit(false);
> 				
> 			} catch (Exception ex) {
> 				
> 				ex.printStackTrace ();
> 				
> 				System.exit (1);
> 			}
> 		}
> 	}
> 	
> 	public class CreateTableThread extends Thread {
> 		
> 		public void run () {
> 			
> 			try {
> 			
> 				String sql = "create table testtab (               " +
> 			             	 "	col1 integer not null primary key, " +
> 			             	 "	col2 varchar(128)                  " +
> 			             	 ")                                    " ;
> 			
> 				Statement stmt = connection2.createStatement ();
> 				
> 				stmt.execute (sql);
> 				
> 			} catch (SQLException ex) {
> 				
> 				ex.printStackTrace ();
> 				
> 				System.exit (1);
> 			}
> 		}
> 	}
> }
> </pre>

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira