Ok, I've pulled this work out of a unit test and ran as an application. A
connection refused exception was exposed; weird that I didn't get one when
I was catching with a general try{}catch(Exception). Regardless, I'll do
some snooping on my own before I continue with this thread.
On Monday, June 15, 2015 at 10:53:28 AM UTC-4, Jason wrote:
>
> Hi,
>
> I'm trying to unit test multiple threads interacting with an H2
> database started as a TCP server and am not getting the results I expect.
> I'm not quite sure if this is just a bad unit test or I'm having trouble
> with H2. I'd appreciate some advice, if possible.
>
> I'm currently using H2 version: *1.3.169*
>
> Here's what I'm doing...
>
> public class PfpInteractionDao {
> public static final String CONNECTION_STRING =
> "jdbc:h2:%s;MV_STORE=FALSE;TRACE_LEVEL_FILE=0";
> public static final String SERVER_CONNECTION_STRING =
> "jdbc:h2:tcp://localhost:%d/%s;MV_STORE=FALSE;TRACE_LEVEL_FILE=0";
> private static final String DATASOURCE_NAME = "gpfp";
> protected SqlSessionFactory sqlSessionFactory;
>
> protected Configuration configuration = null;
>
> private static final Logger logger =
> LoggerFactory.getLogger(PfpInteractionDao.class);
> /**
> * Default interaction. This constructor
> * should only be used for a direct connection.
> */
> public PfpInteractionDao() {
> this(-1);
> }
>
> /**
> * TCP Connection. This constructor should
> * be used for interacting with the datasource in
> * a client-server scenario.
> * @param port number to connect on. Must match server port
> */
> public PfpInteractionDao(int port) {
> //setup initial datasource
> JdbcDataSource datasource = new JdbcDataSource();
> datasource.setUrl(getConnectionString(port));
> datasource.setUser("sa");
>
> //initialize transaction factory & environment
> TransactionFactory transactionFactory = new
> JdbcTransactionFactory();
> Environment environment = new Environment("pd",
> transactionFactory, datasource);
>
> //initialize configuration, aliases, and mappers
> configuration = new Configuration(environment);
> configuration.addMapper(PfpInteraction.class);
>
> initialize();
> }
>
> The DAO is using MyBatis for ORM where the SqlSessionFactory is
> responsible for opening a session and executing queries.
>
> public class TestTcpConnection {
>
> private static String args[] = { "-tcpPort", "15351" };
>
> private static Server server;
>
> private static final Logger logger =
> LoggerFactory.getLogger(TestTcpConnection.class);
>
> @BeforeClass
> public static void init() throws SQLException {
> //configure log4j
> PropertyConfigurator.configure("./deliverables/log4j.properties");
>
> //start the server
> server = Server.createTcpServer(args);
> server.start();
>
> logger.debug(server.getStatus());
> }
>
> @AfterClass
> public static void close() {
> server.stop();
> }
>
> @Test
> public void testTcpServer() throws SQLException, InterruptedException,
> IOException {
> //create a datasource connection
> PfpInteractionDao dao = new
> PfpInteractionDao(Integer.parseInt(args[1]));
> PfpEapg eapg = dao.getPfpEapg(1);
> assertNotNull(eapg);
> }
>
> @Test
> public void testConcurrentConnection() throws SQLException {
> //create and start thread 1
> new Thread(
> new MindlessQuery(new
> PfpInteractionDao(Integer.parseInt(args[1]))),
> "Query-thread-1").start();
> //create and start thread 2
> new Thread(
> new MindlessQuery(new
> PfpInteractionDao(Integer.parseInt(args[1]))),
> "Query-thread-2").start();
> }
> }
>
> Both tests are executing without any exceptions and providing
> somewhat-valid results.... The contents retrieved from the database are
> good for the query, but I'm never getting more then 1 result per thread.
> The Mindless query Runnable is designed to execute a simple query 10000
> times; enough work to ensure both threads can take turns.
>
> public class MindlessQuery implements Runnable {
> private PfpInteractionDao dao;
> private static final Logger logger =
> LoggerFactory.getLogger(MindlessQuery.class);
> public MindlessQuery(PfpInteractionDao dao) {
> this.dao = dao;
> }
>
> public void run() {
> for(int i = 0; i < 10000; i++) {
> PfpEapg eapg = dao.getPfpEapg(1);
> logger.debug("{}", eapg);
> }
> }
> }
>
> When running, the loops begins and successful retrieves the value I need,
> but only once. I've tried to break on it, but even then debugger (in
> eclipse) just runs straight through; I've checked the "suspend thread"
> setting as well for eclipse and it's fine.
>
> Is this a bogus test scenario? Am I overlooking some H2 configuration?
>
> My logged results are:
>
> [DEBUG] TestTcpConnection:36 - TCP server running at tcp://
> 143.122.1.181:15351 (only local connections)
> [DEBUG] MindlessQuery:19 - PfpEapg{1, 2, 1, 0, 0, 0, 2, 2, 0, 2, 0}
> [DEBUG] MindlessQuery:19 - PfpEapg{1, 2, 1, 0, 0, 0, 2, 2, 0, 2, 0}
>
> Why am I only getting two results? I'm expecting 20000 results
> intermingled between two threads.
>
>
--
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 http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.