2012-10-24 38 views
0

我需要從我的eclipse項目連接到MySQL遠程數據庫。從Eclipse遠程連接到MySQL數據庫

我改變這樣我的context.xml:

<Resource name="jdbc/aname" auth="Container" type="javax.sql.DataSource" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      username="userdb" password="pwddb" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://ipaddress/dbname" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" /> 

我使用一個連接池,並在查找我用

DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/aname"); 

我不連接到數據庫成功。我得到這個異常:

Unexpected exception resolving reference 
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) 
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) 
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2332) 
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369) 
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153) 
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) 
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
at sun.reflect.GeneratedConstructorAccessor22.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) 
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) 
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:266) 
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:175) 
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:667) 
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:607) 
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:470) 
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:135) 
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:112) 
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:99) 
at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:501) 
at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:224) 
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:143) 
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:843) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:168) 
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158) 
at javax.naming.InitialContext.lookup(InitialContext.java:411) 
at mypackage.login.LoginValidatorAction.execute(LoginValidatorAction.java:44) 
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58) 
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67) 
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) 
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) 
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305) 
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) 
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) 
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 
Caused by: java.net.ConnectException: Connection timed out: connect 
at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69) 
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) 
at java.net.Socket.connect(Socket.java:579) 
at java.net.Socket.connect(Socket.java:528) 
at java.net.Socket.<init>(Socket.java:425) 
at java.net.Socket.<init>(Socket.java:241) 
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257) 
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) 
... 61 more 

javax.naming.NamingException: Communications link failure 

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 
at org.apache.naming.NamingContext.lookup(NamingContext.java:860) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:168) 
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158) 
at javax.naming.InitialContext.lookup(InitialContext.java:411) 
at mypackage.login.LoginValidatorAction.execute(LoginValidatorAction.java:44) 
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58) 
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67) 
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) 
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) 
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305) 
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) 
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) 
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 

編輯

我發現紐約的MySQL數據庫的主機不允許從出其網絡連接

+0

嘗試指定您的MySQL端口ind datsource jdbc url –

+0

@ KonstantinV.Salikhov:在url =「jdbc:mysql:// ipaddress/dbname」? url =「jdbc:mysql:// ipaddress:3306/dbname」例如?我試過了,它不起作用。通過PHP我成功地訪問數據庫,使用該參數,所以我不認爲這是一個端口問題。 – Sefran2

回答

0

我會建議嘗試一個測試項目,使確定你可以遠程連接。下面是應該工作的代碼示例 - 您需要指定Ipaddress,用戶名,密碼以及您希望連接到的數據庫名稱,並在括號中標記。確保MySQL數據庫的用戶名具有遠程訪問權限(類似於授予所有特權對exampledb。* TO username @'%'IDENTIFIED BY'password';)請注意,'%'指定連接可以來自任何IP -地址。

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class JDBCExample { 

public static void main(String[] argv) throws SQLException { 

    //------------------------------------------------------------------------- 
    System.out.println("-------- MySQL JDBC Connection Testing ------------"); 

    try { 

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

    } catch (ClassNotFoundException e) { 

     System.out.println("Where is your MySQL JDBC Driver?"); 
     e.printStackTrace(); 
     return; 

    } 

    System.out.println("MySQL JDBC Driver Registered!"); 
    Connection connection = null; 

    try { 
     connection = DriverManager 
       .getConnection("jdbc:mysql://192.168.1.8:3306/[DATABASE_NAME_HERE]", 
         "[YOUR_USERNAME]", "[YOUR_PASSWORD]"); 

    } catch (SQLException e) { 
     System.out.println("Connection Failed! Check output console"); 
     e.printStackTrace(); 
     return; 
    } 

    if (connection != null) { 
     System.out.println("You made it, take control your database now!"); 
    } else { 
     System.out.println("Failed to make connection!"); 
    } 
    //------------------------------------------------------------------------- 

      /* 
    Statement stmt = connection.createStatement(); 
    boolean result = stmt.execute("CREATE TABLE Students " + 
      " (student_ID INT UNSIGNED NOT NULL AUTO_INCREMENT, " + 
      " PRIMARY KEY (student_ID), firstName varchar(255), " + 
      " lastName varchar(255))"); 
    System.out.println("\tTable creation result: " + result + "\t"); 
    System.out.println("**Note: The expected result is FALSE"); 
      */ 
} 
} 

編輯:此解決方案適用於使用InnoDB引擎在Linux服務器上運行的MySQL 5.5安裝。上面的代碼是從Eclipse中運行的,其中的Connector/J .jar文件包含在項目屬性的構建路徑中 - 這只是爲了闡明。

+0

測試完成,結果是字符串-------- MySQL JDBC連接測試------------ MySQL JDBC驅動註冊! 連接失敗!檢查輸出控制檯 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信鏈路故障 成功發送到服務器的最後一個數據包是0毫秒前。驅動程序尚未收到來自服務器的任何數據包。 – Sefran2

+0

你有權訪問運行MySQL數據庫的服務器嗎?如果是這樣,在命令行上運行「mysql --version」並檢查分配號碼;檢查你的mysql配置文件(/etc/mysql/my.cnf)並確保mysqld被設置爲在端口3306上偵聽;並且你需要確保你的mysql用戶有權遠程訪問。然後嘗試「sudo /etc/init.d/mysql restart」重新加載mysql服務器進程。你在同一個本地網絡上運行所有這些服務器,我只是從另一臺機器上運行? –

+0

答案是你的最後一個問題...我發現我的MySQL數據庫託管不允許連接從它的網絡。感謝您的建議。我會試着找出是否支持SSH隧道。 – Sefran2