当前位置: 首页 > 面试题库 >

使用Java应用程序远程连接到H2数据库

申屠晟
2023-03-14
问题内容

我遇到以下问题:当我尝试使用外部IP地址(PC的IP而不是本地IP的createTcpServer
=在cmd.exe中运行ipconfig后我们看到的输出)时,发生以下错误:

服务器错误:异常打开端口“ 9092”(端口可能正在使用),原因:“ java.net.BindException:无法分配请求的地址:JVM_Bind”
[90061-169]

但是,该端口未使用。我已经使用netstat -a -n进行了检查。我已启用我的外部IP,并且已从路由器禁用了防火墙。我的外部IP现在可以被ping通了。

请帮我。

更新:这是我启动tcp服务器的代码。

package businessApp;

import org.h2.tools.Server; //imports the server utility

public class startTcpServerForH2 {

    Server server; //the server's instance variable

    private static final String SERVER_IP = "192.168.1.101"; //fixed IP of the server
    private static final String SERVER_PORT = "9092"; //fixed port the server is listening to

    public void tcpServer() { //method responsible to create the tcp server

        optionPane optPane = new optionPane(); //option pane for debugging purposes, shows the server's status

        try { //catches any server related errors, if the connection is broken etc.

            //server uses the IP and port defined earlier, allows other computers in the LAN to connect and implements the secure socket layer (SSL) feature
            server = Server.createTcpServer( //create tcp server
                new String[] { "-tcpPort" , SERVER_PORT , "-tcpAllowOthers" , "-tcpSSL" }).start();

            System.out.println(server.getStatus()); //prints out the server's status
            optPane.checkServerStatus(server.getStatus()); //prints out the server's status on the option pane as well

        } catch(Exception ex){
            System.out.println("Error with Server: " + ex.getMessage());
        }
    }

    public static void main(String[] args){

        startTcpServerForH2 tcpServ = new startTcpServerForH2(); //create a new server object
        tcpServ.tcpServer(); //starts the tcp server
    }
}

第二次更新:这是h2Connection代码。

打包businessApp;

导入java.sql。*; //导入sql功能

//负责与H2数据库引擎连接的类public class h2Connection {

Connection conn;        //connection variable
DatabaseMetaData dbmd;  /** Metadata variable which include methods such as the following:
                         * 1) Database Product Name
                         * 2) Database Product Version
                         * 3) URL where the database files are located (in TCP mode)
                        */
Statement stm;          //statements variable
ResultSet rst;          //result sets variable

private static final String SERVER_IP = "..."; //here I enter my WAN_IP
private static final String SERVER_PORT = "9092";

public Connection connectionToH2(Connection connt) {

    optionPane optPane = new optionPane(); //create new option pane object
    String outputConn = null; //declare & initialize string which will hold important messages

    try {

        Class.forName("org.h2.Driver"); //Driver's name
        /** The String URL is pertained of the following:
         *  1) jdbc which java implements so that it can take advantage of the SQL features
         *  2) Which Database Engine will be used
         *  3) URL where the files will be stored (as this is a TCP connection)
         *  4) Schema: businessApp
         *  5) Auto server is true means that other computers can connect with the same databse at any time
         *  6) Port number of the server is also defined
         */

        String url = "jdbc:h2:tcp://" + SERVER_IP + ":" + SERVER_PORT + "/C:/Databases/businessApp;IFEXISTS=TRUE";
        System.out.println(url); //prints out the url the database files are located as well as the h2 features used (SSL)
        connt = DriverManager.getConnection(url, "sa", ""); //Driver Manager defines the username & password of the database
        System.out.println(connt.getCatalog()); //prints out the database schema
        optPane.checkServerStatus(connt.getCatalog()); //prints out the database schema on the option pane as well
        connt.setAutoCommit(false); //set AutoCommit to false to control commit actions manually

        //outputs H2 version and the URL of the database files which H2 is reading from, for confirmation
        dbmd = connt.getMetaData(); //get MetaData to confirm connection

        outputConn = "Connection to "+dbmd.getDatabaseProductName()+" "+
                   dbmd.getDatabaseProductVersion()+ " with the URL " + dbmd.getURL()+" was successful.\n";
        System.out.println(outputConn);  //outputs the message on the system (NetBeans compiler)
        optPane.checkH2Connection(outputConn); //outputs the message on top of the frame


    } catch (ClassNotFoundException ex){ //In case there is an error for creating the class for the Driver to be used
        System.out.println("Error creating class: " + ex.getMessage());
    } catch(SQLException ex){ //Any error associated with the Database Engine
        System.out.println("SQL error: " + ex.getMessage());
        optPane.checkServerStatus("SQL error: " + ex.getMessage());
    }
    return connt; //As the method is not void, a connection variable must be returned
}

}

当我想连接到h2数据库时,创建一个新的h2Connection对象并使用它进行连接。我逐字地遵循了H2手册。您还需要什么?


问题答案:

如下面所示的命令行帮助中所述,“
防止远程访问”
建议以下内容:

默认情况下,启动H2控制台,TCP服务器或PG服务器时,该数据库不允许来自其他计算机的连接。远程访问可以使用命令行选项来启用-webAllowOthers-tcpAllowOthers-pgAllowOthers

有关这些选项的重要注意事项,请参阅文档。

附录:对我有用,只要打开防火墙Server 重新启动即可;您根本不需要setProperty()生产线;在LAN IP到你的WAN_IP转发端口9092应该是您的主机的IP地址; 然后您可以通过以下方式打开外壳WAN_IP

java -cp h2.jar org.h2.tools.Shell -url 
    jdbc:h2:tcp://WAN_IP/~/path/to/test;ifexists=true"

命令行帮助:

$ java -cp。:/ opt / h2 / bin / h2.jar org.h2.tools.Shell-?
使用JDBC访问数据库的交互式命令行工具。
用法:java org.h2.tools.Shell 
选项区分大小写。支持的选项有:
[-帮助]或[-?]打印选项列表
[-url“”]数据库URL(jdbc:h2:...)
[-user]用户名
[-password]密码
[-driver]要使用的JDBC驱动程序类(在大多数情况下不是必需的)
[-sql“”]执行SQL语句并退出
[-properties“”]从此目录加载服务器属性
如果特殊字符无法正常工作,则可能需要使用
 -Dfile.encoding = UTF-8(Mac OS X)或CP850(Windows)。
另请参见http://h2database.com/javadoc/org/h2/tools/Shell.html

$ java -cp /opt/h2/bin/h2.jar org.h2.tools.Server-?
启动H2控制台(Web-)服务器,TCP和PG服务器。
用法:java org.h2.tools.Server 
不带选项运行时,将启动-tcp,-web,-browser和-pg。
选项区分大小写。支持的选项有:
[-帮助]或[-?]打印选项列表
[-web]使用H2控制台启动Web服务器
[-webAllowOthers]允许其他计算机连接-参见下文
[-webDaemon]使用守护程序线程
[-webPort]端口(默认值:8082)
[-webSSL]使用加密(HTTPS)连接
[-浏览器]启动浏览器连接到Web服务器
[-tcp​​]启动TCP服务器
[-tcp​​AllowOthers]允许其他计算机连接-参见下文
[-tcp​​Daemon]使用守护程序线程
[-tcp​​Port]端口(默认值:9092)
[-tcp​​SSL]使用加密(SSL)连接
[-tcp​​Password]关闭TCP服务器的密码
[-tcp​​Shutdown“”]停止TCP服务器;示例:tcp:// localhost
[-tcp​​ShutdownForce]不要等到所有连接都关闭
[-pg]启动PG服务器
[-pgAllowOthers]允许其他计算机连接-参见下文
[-pgDaemon]使用守护线程
[-pgPort]端口(默认值:5435)
[-properties“”]服务器属性(默认:〜,禁用:null)
[-baseDir] H2数据库的基本目录(所有服务器)
[-ifExists]只能打开现有数据库(所有服务器)
[-trace]打印其他跟踪信息(所有服务器)
选项-xAllowOthers有潜在的风险。
有关详细信息,请参阅“高级主题/防止远程访问”。
另请参见http://h2database.com/javadoc/org/h2/tools/Server.html


 类似资料:
  • 问题内容: 我正在研究将由学校使用的应用程序。每所学校将建立自己的数据库。每个学校都会为应用程序提供自己的“设置”文件。设置文件将包含创建设置文件的特定学校的数据库URL。这样一来,使用该应用程序的学生如果想连接到其他数据库,就只能加载其他设置文件。 我的问题是,如何保护用于连接数据库的用户名和密码?因此,只有应用程序具有对数据库的读写访问权限。应用程序仅具有该特定学校的读写权限吗? 如果您需要更

  • 我在将 rails 2.3.5 应用程序连接到远程数据库时遇到问题。 在我的数据库.yml中,我有: 我得到的错误是: 无法通过套接字连接到本地 MySQL 服务器 (2) 我知道问题不在权限或用户设置上,因为当我使用相同的mysqlgem运行一个简单的ruby脚本时,它会起作用。此外,我的python脚本可以连接,我可以通过CLI与连接 我似乎无法让rails使用192.168.1.113而不是

  • 从。NET应用程序连接到远程MongoDb实例有点困难。 我创建了一个非常简单的控制台应用程序,它基本上是一个冒烟测试,并带回一个项目。如果我在运行MongoDb服务的服务器上运行它,它将与MongoDb进行对话,不会有任何问题。ConnectionString就是。 我已经为服务器上的27017端口创建了一个inboudd规则,甚至完全关闭了防火墙。 Mongo服务器的cfg文件非常基本: 干杯

  • 问题内容: 我正在使用SQL Server 2008 R2和Microsoft Excel。 我已将服务器设置为通过Windows用户 或 数据库用户登录 我 可以 用数据库用户正常登录数据库 我 可以 使用Silverlight应用程序连接到数据库 我 无法 弄清楚如何从Excel中的远程PC连接 我去了Excel->数据->从其他来源->从SQL Server 我的服务器名称是,因此在Exce

  • 问题内容: 如何从Java应用程序通过SSH连接到远程MySQL数据库?小代码示例对我有所帮助,对此我将不胜感激。 问题答案: 我的理解是,您想访问在远程计算机上运行的mysql服务器,并通过SSH隧道侦听端口3306。 要使用命令行ssh客户端从本地计算机上的端口1234到远程计算机上的端口3306的隧道,您可以从本地计算机上键入以下命令: 要从Java执行相同的操作,可以使用JSch(SSH2

  • 示例代码: 客户端日志: 13/02/06 10:58:32信息zookeeper.clientcnxn:服务器192.168.113.27/192.168.113.27:2181上完成会话建立,sessionid=0x13CAE4BD91B0003,协商超时=40000