db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mikael Hakman (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-6074) DatabaseMetaData.getTables not updated in multi thread multi connection application
Date Sun, 17 Feb 2013 16:47:12 GMT

    [ 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

Mime
View raw message