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

Posted

技术标签:

【中文标题】H2 数据库服务器从连接池为 TCP 客户端提供服务【英文标题】:H2 Database Server to serve TCP clients from connection pool 【发布时间】:2013-09-26 10:22:37 【问题描述】:

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

我们可以使用任何标志/命令来指定服务器以专用 X 数量的连接吗?

此外,我还研究了从 Application 中启动服务器的可能性。喜欢,

  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 连接并使用 AUTO_SERVER=TRUE 参数。请参阅文档。 【参考方案1】:

您应该以 AUTO_SERVER 模式启动服务器,这样领导选举算法将选举一个领导者,该领导者将读取数据库文件并为所有其他客户端打开 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);
    

【讨论】:

以上是关于H2 数据库服务器从连接池为 TCP 客户端提供服务的主要内容,如果未能解决你的问题,请参考以下文章

多个H2数据库连接,不同的访问方式

ftp交互和控制命令总结

springboot搭建http2服务器和h2c服务器 h2 的http/https 请求服务器

tcp 状态转移图详解

H2 客户端无法连接到服务器

从浏览器输入域名到展示页面都发生了什么