Update: I was able to create a test that results in the same two errors. 
 Please find the attached file.

Note that the exceptions do not happen every run, so you may need to run it 
a number of times for them to appear.

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class TestMultiThreadingH2 {

	private static final String JDBC_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MULTI_THREADED=1;";

	public static void main(String[] args) throws Exception {
		Class.forName("org.h2.Driver");
		
		// create some common tables and views
        Connection conn = DriverManager.getConnection(JDBC_URL, "sa", "");
        Statement stat = conn.createStatement();
        stat.execute("CREATE TABLE INVOICE(INVOICE_ID INT PRIMARY KEY, AMOUNT DECIMAL)");
        stat.execute("CREATE VIEW INVOICE_VIEW as SELECT * FROM INVOICE");
        
        stat.execute("CREATE TABLE INVOICE_DETAIL(DETAIL_ID INT PRIMARY KEY, INVOICE_ID INT, DESCRIPTION VARCHAR)");
        stat.execute("CREATE VIEW INVOICE_DETAIL_VIEW as SELECT * FROM INVOICE_DETAIL");
        
        stat.close();
        conn.close();

        // create views that reference the common views in different threads
		ExecutorService executor = Executors.newFixedThreadPool(8);
		for (int i = 0; i < 30000; i++) {
			final int j = i;
			executor.execute(() -> {
				Connection conn2;
				try {
					
					conn2 = DriverManager.getConnection(JDBC_URL, "sa", "");
					Statement stat2 = conn2.createStatement();

					stat2.execute("CREATE VIEW INVOICE_VIEW" + j + " as SELECT * FROM INVOICE_VIEW");
					
					// the following query intermittently results in a NullPointerException
					stat2.execute("CREATE VIEW INVOICE_DETAIL_VIEW" + j + " as SELECT DTL.* FROM INVOICE_VIEW" + j + 
							" INV JOIN INVOICE_DETAIL_VIEW DTL ON INV.INVOICE_ID = DTL.INVOICE_ID" +
							" WHERE DESCRIPTION='TEST'");
					
					ResultSet rs = stat2.executeQuery("SELECT * FROM INVOICE_VIEW" + j);
			        rs.next();
			        rs.close();
			        
			        rs = stat2.executeQuery("SELECT * FROM INVOICE_DETAIL_VIEW" + j);
			        rs.next();
			        rs.close();
			        
					stat.close();
			        conn.close();
			 
				} catch (Exception e) {
					System.out.println("exception at iteration "+j+":\n");
					e.printStackTrace();
				}
			});
		}
		
		executor.shutdown();
        try {
            executor.awaitTermination(24, TimeUnit.HOURS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
		
	}

}

Reply via email to