Start H2 Database Programmatically

Start H2 Database Programmatically

I'm coding a server-client application in Java and I need to implement a local database on the server side and I decided to go for H2 database engine.

One more thing to add is that I usa TCP connection to start and run the database. This is what I put together so far:

Class.forName("org.h2.Driver");  
Server server = Server.createTcpServer(DB_PATH).start();

Connection currentConn = DriverManager.getConnection(DB_PATH, DB_USER, DB_PASSWORD);   

Where the connection string is jdbc:h2:tcp://localhost/~/test.

That piece of code returns with an exception:

Feature not supported: "jdbc:h2:tcp://localhost/~/test" [50100-176]

I followed this article.

1

3 Answers

Something like this should work

Server server = null;
            try {
                server = Server.createTcpServer("-tcpAllowOthers").start();
                Class.forName("org.h2.Driver");
                Connection conn = DriverManager.
                    getConnection("jdbc:h2:tcp://localhost/~/stackoverflow", "sa", "");
                System.out.println("Connection Established: "
                        + conn.getMetaData().getDatabaseProductName() + "/" + conn.getCatalog());
             
            } catch (Exception e) {
                e.printStackTrace();
            }
        

and the output is Connection Established: H2/STACKOVERFLOW

This has been tested with h2-1.4.184

This is my simple H2-DBManager - just name its filename DBManager.java and feel free to reuse it:

import java.sql.SQLException;

import org.h2.tools.Server;

public class DBManager {

    private static void startDB() throws SQLException {
        Server.createTcpServer("-tcpPort", "9092", "-tcpAllowOthers").start();

    }

    private static void stopDB() throws SQLException {
        Server.shutdownTcpServer("tcp://localhost:9092", "", true, true);
    }

    public static void main(String[] args) {

        try {
            Class.forName("org.h2.Driver");

            if (args.length > 0) {
                if (args[0].trim().equalsIgnoreCase("start")) {
                    startDB();
                }

                if (args[0].trim().equalsIgnoreCase("stop")) {
                    stopDB();
                }
            } else {
                System.err
                        .println("Please provide one of following arguments: \n\t\tstart\n\t\tstop");
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

I was able to do it a little more easily accepting the defaults:

      Server server =  Server.createTcpServer().start();

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Robert Thorne
Author

Robert Thorne

Robert Thorne covers electric vehicle innovations, autonomous driving systems, global mobility trends, and automotive engineering developments.