【发布时间】:2015-12-26 03:22:00
【问题描述】:
我尝试构建一个支持网络/客户端数据库连接的程序。我已经完成了用户与数据库联系的数据库创建和 GUI 设计方面的所有工作。在本地机器上一切正常(我的意思是 DB 创建和启动/停止 Derby Server 的 PC)
服务器配置;
//I take the exact path of derby jar files (derbyrun, derbynet, derby client etc.)
File file = new File(FirstTimeMainFrame.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath().replace(new File(FirstTimeMainFrame.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getName(), "").replace("%20", " "));
String path = file+"\\DB";
//Execute CMD Command for derbyrun.jar set the DERBY INSTALL Classpath
ProcessBuilder builder = new ProcessBuilder();
Process process = null;
String[] commandStart = new String[3];
String[] commandStop = new String[3];
commandStart[0] = "cmd.exe";
commandStart[1] = "/c";
commandStart[2] = "cd "+path+" && java -jar derbyrun.jar server start";
builder = new ProcessBuilder(commandStart[0], commandStart[1], commandStart[2]);
builder.redirectErrorStream(true);
process = builder.start();
//Create the DB with using Derby Client Driver
String driver = "org.apache.derby.jdbc.ClientDriver";
String connectionURL = "jdbc:derby://localhost:1527//myDB"+";create=true";
Class.forName(driver).newInstance();
Connection conn = DriverManager.getConnection(connectionURL);
//Connect to DB and Setting the DB Properties
connectionURL = "jdbc:derby://localhost:1527//myDB"+";create=false";
conn = DriverManager.getConnection(connectionURL);
//Turning on authentication, Create sample users, Create sample tables etc...
//Shutdown the Derby Server
commandStop[0] = "cmd.exe";
commandStop[1] = "/c";
commandStop[2] = "cd "+path+" && java -jar derbyrun.jar server shutdown";
builder = new ProcessBuilder(commandStop[0], commandStop[1], commandStop[2]);
builder.redirectErrorStream(true);
process = builder.start();
本地连接正常;
//Start the Server First
builder = new ProcessBuilder(commandStart[0], commandStart[1], commandStart[2]);
builder.redirectErrorStream(true);
process = builder.start();
//Load the driver and connect to Local DB
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
String connectionUrl = "jdbc:derby://localhost:1527//myDB"+";create=false;" + "user=" +"\""+ unameTextField.getText() +"\""+ ";" + "password=" +"\""+ new String (passwordPasswordField.getPassword()) +"\""+ ";";
Connection con = DriverManager.getConnection(connectionUrl);
Proplematic 远程连接;
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
String connectionUrl = "jdbc:derby://10.90.232.2:1527//myDB"+";create=false;" + "user=" +"\""+ unameTextField.getText() +"\""+ ";" + "password=" +"\""+ new String (passwordPasswordField.getPassword()) +"\""+ ";";
Connection con = DriverManager.getConnection(connectionUrl);
--PC1(服务器一)创建和存储数据库文件。它还具有在程序启动时启动和停止 Derby Network Server 的能力。当 PC1 运行程序时,我在 derby.log 中看到以下行,并了解服务器已成功启动并运行;
Sat Dec 26 04:06:49 EET 2015 : Apache Derby Network Server - 10.12.1.1 - (1704137) started and ready to accept connections on port 1527
Sat Dec 26 04:06:49 EET 2015: Booting Derby version The Apache Software Foundation - Apache Derby - 10.12.1.1 - (1704137): instance a816c00e-0151-dc09-cf3e-ffffaab85dad on database directory C:\Users\Server_PC\Desktop\Trying Project\DB\myDB with class loader sun.misc.Launcher$AppClassLoader@1909752 Loaded from file:/C:/Users/Server_PC/Desktop/Trying%20Project/DB/derby.jar
java.vendor=Oracle Corporation
java.runtime.version=1.8.0_66-b18
user.dir=C:\Users\Server_PC\Desktop\Trying Project\DB
os.name=Windows 7
os.arch=x86
os.version=6.1
derby.system.home=C:\Users\Server_PC\Desktop\Trying Project\DB
Database Class Loader started - derby.database.classpath=''
--PC2(Client one) 尝试使用其 LAN ip 连接到远程服务器。
我已将一些日志写入程序附加到程序中,当我在客户端机器上运行程序时,我看到下面的异常;
java.sql.SQLNonTransientConnectionException: java.net.ConnectException : Error connecting to server 10.90.232.2 on port 1.527 with message Connection timed out: connect.
我真的被困在这一点上。我错过了什么吗?
【问题讨论】:
-
可能是 Windows 防火墙,它通常默认开启,它会阻止从另一台机器到 Derby Network Server 的入站连接,除非您明确配置 Windows 防火墙以允许此类连接。跨度>
-
我忘了说对不起。我已经将 1527 的防火墙端口规则添加到 PC1 的入站和出站。有趣的是,当我在 PC1 isee 127.0.0.1 1527 中使用
netstat -an | find "1527"检查网络路由时,1527 处于 LISTENING 状态。应该是 10.90.232.2 1527 吗? -
您可以使用 -h 和 -p 参数来影响 Derby Network Server 的侦听地址和端口。
-
完全正确。我在大约 6-7 小时前找到了解决方案。对于服务器 Start 应该是
commandStart[2] = "cd "+path+" && java -jar derbyrun.jar server start -h 10.90.232.2";和shutdown commandStop[2] = "cd "+path+" && java -jar derbyrun.jar server shutdown -h 10.90.232.2";而不是服务器和客户端连接到String connectionUrl = "jdbc:derby://10.90.232.2:1527/myDB"+";create=false;" + "user=" +"\""+ unameTextField.getText() +"\""+ ";" + "password=" +"\""+ new String (passwordPasswordField.getPassword()) +"\""+ ";"; -
很高兴听到它现在正在工作。我将编辑问题标题以明确您的问题涉及如何配置 Derby 网络服务器以遵守您的防火墙限制,并发布您的工作解决方案作为答案。