2014-06-13 123 views
0

我正在編寫一個程序來將東西推送到遠程數據庫中。我的數據庫存儲在紅帽服務器上,而我的程序寫在Windows機器上。使用Java連接到遠程MySQL服務器

我不想讓我的服務器地址,但可以說我的Linux服務器是xx.xx.xx.xx8

MySQL工作臺窗口中說,我的MySQL服務器主機是127.0.0.1:3306

我知道有一百萬個類似的問題,但每個問題都非常獨特。

我一直在使用http://www.vogella.com/tutorials/MySQLJava/article.html#javaconnection作爲指導,但這看起來像一個本地連接。

我也一直在引用它,但它讓我感到困惑。

下面是一些代碼,模仿了,我覺得可能工作:

Connection connection = null; 
String dburl = "jdbc:mysql://127.0.0.1:3306/Db_Name"; 
String userName = "user"; 
String passWord = "password"; 



try { 
     Class.forName("com.mysql.jdbc.Driver"); 

     connection = DriverManager.getConnection(dburl, userName, passWord); 
     Statement st = connection.createStatement();         

     String query = "INSERT INTO Example (`TestColumn`) VALUES('hello')"; 
     int rsI = st.executeUpdate(query); 
     System.out.println("Hi"); 
     }catch (Exception e) { 
     System.out.println(e); 
    } finally { 
     if (connection != null) { 
      try { 
       connection.close(); 
       System.out.println("Database connection terminated"); 
      } catch (Exception e) { /* ignore close errors */ } 
     } 
    } 

是基於我所提供的鏈接。我改變的只是地址。我不知道服務器地址xx.xx.xx.xx8應該放在哪裏。

+1

當然,在JDBC數據庫的URL:jdbc:mysql:// host:3306/Db_Name – duffymo

+0

@duffymo好的,那麼本地主機地址將綁定在哪裏? – user3521471

+0

是否要連接到在xx.xx.xx.xx8服務器IP或本地主機上運行的數據庫?一次一個,但不是兩個。你的問題沒有意義。 – duffymo

回答

0

你可以看到documentation說:

的方法DriverManager.getConnection就建立一個數據庫連接 。此方法需要一個數據庫URL,根據您的DBMS不同,該數據庫URL可能會有所不同 。以下是數據庫 URL的一些例子:

的MySQL爲:jdbc:mysql的://本地主機:3306 /,其中localhost是 服務器託管數據庫的名稱,3306是端口號

因此,對於MySQL的連接器/ J數據庫URL

以下是MySQL連接器/ J數據庫連接URL語法:

的jdbc:mysql的:// [主持人] [,... failoverhost ] [:端口] [?propertyName1]/[數據庫] [= propertyValue1] [& propertyName2] [= propertyValue2] ...

其中:

  • 主機:端口是託管數據庫的計算機的主機名和端口號。如果未指定,則主機和端口的默認值分別爲127.0.0.1和3306。因此,您所做的每項操作都將應用於此職位

  • 數據庫是要連接到的數據庫的名稱。如果未指定,則建立一個沒有默認數據庫的連接。

  • failover是備用數據庫的名稱(MySQL Connector/J支持故障轉移)。
  • propertyName = propertyValue表示可選的由&符分隔的屬性列表。這些屬性使您能夠指示MySQL Connector/J執行各種任務。

更新:如果你有,你要訪問的遠程數據庫(遠程服務器),你應該有一個例子:

String dburl = "jdbc:mysql://<REMOTE_HOST>:3306/Db_Name"; //replace with your remote host 
... // here all the code related to your remote host 

注意:如果遠程服務器在其配置「本地主機」你必須通過執行ifconfig找出其公共IP地址。然後在你的字符串上使用它的IP地址。由於重要請注意您的遠程服務器必須配置爲允許遠程連接。

+0

好吧,讓我們說我的MySQL服務器位置是localhost:3306。我如何告訴java主機linux服務器在哪裏? – user3521471

+0

你必須使用:String dburl =「jdbc:mysql:// localhost:3306/Db_Name」; –

+0

是的,我明白這一點。但MySQL服務器安裝在遠程RedHat服務器上。如果不知道主機服務器,使用localhost:3306是無用的。那有意義嗎?我不確定我是否正確解釋了這一點。 – user3521471

1

爲了連接到遠程數據庫,您需要知道服務器的外部(或稱爲公共)IP地址。

String dburl = "jdbc:mysql://85.65.85.222:3306/Db_Name" 

即使你在服務器上的數據庫說是localhost:3306,你可以使用公共IP與正確的端口仍然連接到它。 (假設您有足夠的服務器訪問權限)

有時候可能會出現這樣的情況,即使您知道遠程服務器的IP地址,您仍然無法直接連接到遠程數據庫,可能是由於端口被阻塞或其他原因ACL問題(如果您無法控制此問題,則這適用於此問題)。然而,你可以創建ssh隧道到該服務器並創建一個端口轉發。

JSch jsch = new JSch(); 
Session session = jsch.getSession(user, host); 
session.setPassword(password); 
session.connect(timeout); 
session.setPortForwardingL(listenPort, destHost, destPort); 

例如SSH connnection可能是這個樣子:

ssh [email protected] -Llocalhost:5050:127.0.0.1:3306 < - 這將創建一個端口轉發的SSH隧道,你的本地計算機,你有你的代碼和整個環境中,你依然會對意思能夠使用

String dburl = "jdbc:mysql://localhost:5050/dbname" 
0

,如果你連接到服務器(即與IP xx.xx.xx.xx8)連接到遠程數據庫您通過指定端口(通常是3306)要牛逼o連接到該機器上的數據庫服務器。所以簡單使用:

String dburl = "jdbc:mysql://xx.xx.xx.xx8:3306/Db_Name"; 

作爲您的連接字符串。

如果您不知道端口,mysql正在運行,請查看您的/etc/mysql/my.cnf文件。應該有指定的端口。

如果您無法連接並確保啓用了遠程連接(這裏有一個很好的教程來啓用它):http://www.cyberciti.biz/tips/how-do-i-enable-remote-access-to-mysql-database-server.html),還可以查看您的防火牆規則。

0

只是爲了澄清任何人都希望在此之後...

本地主機始終是你坐在機器 - 永遠。您無法使用本地主機連接到遠程Box。另外,IP地址127.0.0.1等同於本地主機,所以請不要使用它。

您可能會看到數據庫綁定到數據庫服務器上的localhost或127.0.0.1。那沒問題。在您的數據庫連接URL

mysql:jdbc://<IPOfServer>:<PortOfServer>/<DbName>). 

使用服務器上運行的數據庫中的IP地址,您可以通過在數據庫服務器上運行以下命令查找服務器的IP地址...

窗口:IPCONFIG

Linux:ifconfig

祝你好運!