H2数据库服务器从连接池为TCP客户端提供服务

H2数据库服务器从连接池为TCP客户端提供服务,tcp,connection,h2,Tcp,Connection,H2,我有一个H2服务器,我从控制台启动。来自不同机器的客户端访问服务器并调用函数别名(在数据库中注册)。问题是,这个函数的调用次数超过了一百万次。因此,在本例中,连接超时,但随后我通过将客户端连接字符串更改为AUTORECONNECT=TRUE来解决它。这解决了问题,但增加了重新连接时间延迟(我希望避免) 是否有任何标志/命令可用于指定服务器专用于X数量的连接 此外,我还研究了从应用程序内部启动服务器的可能性。像 JdbcConnectionPool cp = JdbcConnectionPoo

我有一个H2服务器,我从控制台启动。来自不同机器的客户端访问服务器并调用函数别名(在数据库中注册)。问题是,这个函数的调用次数超过了一百万次。因此,在本例中,连接超时,但随后我通过将客户端连接字符串更改为AUTORECONNECT=TRUE来解决它。这解决了问题,但增加了重新连接时间延迟(我希望避免)

是否有任何标志/命令可用于指定服务器专用于X数量的连接

此外,我还研究了从应用程序内部启动服务器的可能性。像

  JdbcConnectionPool cp = JdbcConnectionPool.create(
             "jdbc:h2:tcp://IPADDRESS:9092/~/test", "sa", "");

  cp.setMaxConnections(MAX_CONN_IN_POOL);

  // start the TCP Server
  Server server = Server.createTcpServer().start();

  Connection conn = cp.getConnection();
  Statement stat = conn.createStatement();
  stat.execute("SELECT myFunctionAlias(arg)");

  cp.dispose();
  server.stop();

上面的示例代码确实启动了服务器,并且只运行一次。我希望服务器是开放的,并保持侦听客户端,并从连接池为它们提供服务。有任何指针吗?

您应该在自动服务器模式下启动服务器,这样领导者选举算法将选择一位领导者,他将读取数据库文件并为所有其他客户端打开TCP服务器。 这样,服务器读取文件的速度将非常快,而其他客户端的速度将与网络一样快。 只要使用相同的连接字符串,这对用户是透明的

    Connection connection;
    String dataBaseString = "jdbc:h2:/path/to/db/" + File.separator + "db;create=true;AUTO_SERVER=TRUE;AUTO_RECONNECT=TRUE";
    try
    {
        Class.forName("org.h2.Driver");
        log.info("getConnection(), driver found");
    }
    catch (java.lang.ClassNotFoundException e)
    {
        log.error("getConnection(), ClassNotFoundException: " + e.getMessage(), e);
        Main.quit();
    }
    try
    {
        connection = DriverManager.getConnection(dataBaseString);
    }

这里有三项。第一:连接池位于客户端。第二:你需要一个无限循环来服务。第三:您本身不需要“服务器”,您的客户端应该使用到DB的TCP连接,并使用AUTO_server=TRUE参数。请参阅文档。