- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想出了如何在 Java 应用程序中连接到我的远程 MySQL 服务器。我很清楚这一点。我已经提供了我的代码和执行相同操作所采取的步骤,但来自 Android 应用程序。
问题 我的代码没有连接有什么问题?我在 Java 中使用了类似的过程,并且效果很好。
1) 我在项目属性中添加了 mysql-connector.jar 的外部 JAR 文件(我相信我使用的是 5.1)。这工作正常,因为我在我的 Java 应用程序中使用它并且它与它连接。
2) 下面是连接和查询数据库的代码。我省略了查询信息和服务器信息,用 < > 代替。显然:P
3) 当我在手机上运行该应用程序时,我收到以下消息:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链接失败。
4) 我在 Ubuntu 服务器上运行 wireshark,当它监听 mysql 端口时只看到 SSTP 条目。
package com.example.test_android;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
private static final String url = "jdbc:mysql://<server ip>:<sql port#>/<database name>";
private static final String user = "<username>";
private static final String pass = "<password>";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testDB();
}//end oncreate method
public void testDB() {
TextView tv = (TextView)this.findViewById(R.id.text_view);
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(url, user, pass);
/* System.out.println("Database connection success"); */
String result = "Database connection success\n";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM <table in database>");
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()) {
result += rsmd.getColumnName(1) + ": " + rs.getInt(1) + "\n";
result += rsmd.getColumnName(2) + ": " + rs.getString(2) + "\n";
result += rsmd.getColumnName(3) + ": " + rs.getString(3) + "\n";
}
tv.setText(result);
}
catch(Exception e) {
e.printStackTrace();
tv.setText(e.toString());
}
}
}//end class
5) 堆栈跟踪:
03-20 11:50:46.381: W/SurfaceFlinger(334): id=54501 Removed idx=5 Map Size=4
03-20 11:50:46.381: D/memalloc(334): ion: Freeing buffer base:0x42fb0000 size:1228800 fd:50
03-20 11:50:46.381: D/memalloc(334): ion: Freeing buffer base:0x43107000 size:1228800 fd:11
03-20 11:50:46.381: W/SurfaceFlinger(334): id=54501 Removed idx=-2 Map Size=4
03-20 11:50:46.381: D/memalloc(334): ion: Freeing buffer base:0x43c2d000 size:1228800 fd:53
03-20 11:50:46.381: D/KeyguardViewMediator(648): setHidden false
03-20 11:50:47.302: E/MP-Decision(1366): DOWN Ld:51 Ns:1.100000 Ts:190 rq:1.000000 seq:196.000000
03-20 11:50:47.492: D/STATUSBAR-NetworkController(805): onReceive() - RSSI_CHANGED_ACTION, WIFI_STATE, NETWORK_STATE
03-20 11:50:48.143: E/SMD(330): DCD ON
03-20 11:50:48.603: V/WindowOrientationListener(648): nearestRotation : 0 Angle: 348 tilt: 45
03-20 11:50:50.535: D/STATUSBAR-NetworkController(805): onReceive() - RSSI_CHANGED_ACTION, WIFI_STATE, NETWORK_STATE
03-20 11:50:50.555: E/MP-Decision(1366): UP Ld:50 Nw:1.990000 Tw:140 rq:2.700000 seq:147.000000
03-20 11:50:50.946: W/dalvikvm(23747): VFY: unable to find class referenced in signature (Ljavax/naming/Reference;)
03-20 11:50:50.946: I/dalvikvm(23747): Could not find method javax.naming.Reference.get, referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.initializeFrom
03-20 11:50:50.946: W/dalvikvm(23747): VFY: unable to resolve virtual method 11306: Ljavax/naming/Reference;.get (Ljava/lang/String;)Ljavax/naming/RefAddr;
03-20 11:50:50.946: D/dalvikvm(23747): VFY: replacing opcode 0x6e at 0x0004
03-20 11:50:50.946: W/dalvikvm(23747): VFY: unable to find class referenced in signature (Ljavax/naming/Reference;)
03-20 11:50:50.946: E/dalvikvm(23747): Could not find class 'javax.naming.StringRefAddr', referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.storeTo
03-20 11:50:50.946: W/dalvikvm(23747): VFY: unable to resolve new-instance 944 (Ljavax/naming/StringRefAddr;) in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;
03-20 11:50:50.946: D/dalvikvm(23747): VFY: replacing opcode 0x22 at 0x0006
03-20 11:50:50.956: D/dalvikvm(23747): DexOpt: unable to opt direct call 0x2c2c at 0x14 in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;.storeTo
03-20 11:50:51.146: E/SMD(330): DCD ON
03-20 11:50:51.476: I/dalvikvm(23747): Could not find method java.lang.management.ManagementFactory.getThreadMXBean, referenced from method com.mysql.jdbc.MysqlIO.appendDeadlockStatusInformation
03-20 11:50:51.476: W/dalvikvm(23747): VFY: unable to resolve static method 10657: Ljava/lang/management/ManagementFactory;.getThreadMXBean ()Ljava/lang/management/ThreadMXBean;
03-20 11:50:51.476: D/dalvikvm(23747): VFY: replacing opcode 0x71 at 0x0079
03-20 11:50:51.576: W/System.err(23747): com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
03-20 11:50:51.576: W/System.err(23747): The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
03-20 11:50:51.576: W/System.err(23747): at java.lang.reflect.Constructor.constructNative(Native Method)
03-20 11:50:51.576: W/System.err(23747): at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
03-20 11:50:51.576: W/System.err(23747): at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
03-20 11:50:51.586: W/System.err(23747): at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
03-20 11:50:51.586: W/System.err(23747): at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
03-20 11:50:51.586: W/System.err(23747): at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2332)
03-20 11:50:51.586: W/System.err(23747): at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369)
03-20 11:50:51.586: W/System.err(23747): at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
03-20 11:50:51.586: W/System.err(23747): at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
03-20 11:50:51.596: W/System.err(23747): at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
03-20 11:50:51.596: W/System.err(23747): at java.lang.reflect.Constructor.constructNative(Native Method)
03-20 11:50:51.596: W/System.err(23747): at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
03-20 11:50:51.596: W/System.err(23747): at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
03-20 11:50:51.596: W/System.err(23747): at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
03-20 11:50:51.596: W/System.err(23747): at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
03-20 11:50:51.606: W/System.err(23747): at java.sql.DriverManager.getConnection(DriverManager.java:175)
03-20 11:50:51.606: W/System.err(23747): at java.sql.DriverManager.getConnection(DriverManager.java:209)
03-20 11:50:51.606: W/System.err(23747): at com.example.test_android.MainActivity.testDB(MainActivity.java:34)
03-20 11:50:51.606: W/System.err(23747): at com.example.test_android.MainActivity.onCreate(MainActivity.java:24)
03-20 11:50:51.606: W/System.err(23747): at android.app.Activity.performCreate(Activity.java:4470)
03-20 11:50:51.616: W/System.err(23747): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
03-20 11:50:51.616: W/System.err(23747): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
03-20 11:50:51.616: W/System.err(23747): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
03-20 11:50:51.616: W/System.err(23747): at android.app.ActivityThread.access$600(ActivityThread.java:128)
03-20 11:50:51.616: W/System.err(23747): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
03-20 11:50:51.616: W/System.err(23747): at android.os.Handler.dispatchMessage(Handler.java:99)
03-20 11:50:51.626: W/System.err(23747): at android.os.Looper.loop(Looper.java:137)
03-20 11:50:51.626: W/System.err(23747): at android.app.ActivityThread.main(ActivityThread.java:4517)
03-20 11:50:51.626: W/System.err(23747): at java.lang.reflect.Method.invokeNative(Native Method)
03-20 11:50:51.626: W/System.err(23747): at java.lang.reflect.Method.invoke(Method.java:511)
03-20 11:50:51.626: W/System.err(23747): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
03-20 11:50:51.626: W/System.err(23747): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
03-20 11:50:51.636: W/System.err(23747): at dalvik.system.NativeStart.main(Native Method)
03-20 11:50:51.636: W/System.err(23747): Caused by: java.net.SocketException: android.os.NetworkOnMainThreadException
03-20 11:50:51.636: W/System.err(23747): at com.mysql.jdbc.StandardSocketFactory.unwrapExceptionToProperClassAndThrowIt(StandardSocketFactory.java:408)
03-20 11:50:51.636: W/System.err(23747): at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:269)
03-20 11:50:51.646: W/System.err(23747): at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
03-20 11:50:51.646: W/System.err(23747): ... 28 more
03-20 11:50:51.786: W/SurfaceFlinger(334): id=54502(1) createSurface 0x1b75144 (1x1),2 flag=400
03-20 11:50:51.786: D/KeyguardViewMediator(648): setHidden false
03-20 11:50:51.786: D/STATUSBAR-StatusBarManagerService(648): setSystemUiVisibility(0x0)
03-20 11:50:51.786: D/STATUSBAR-StatusBarManagerService(648): manageDisableList what=0x0 pkg=WindowManager.LayoutParams
03-20 11:50:51.867: D/CLIPBOARD(1073): Hide Clipboard dialog at Starting input: finished by someone else... !
03-20 11:50:51.867: I/ClipboardServiceEx(648): mCBPickerDialog enter case. MSG_DISMISS_DIALOG
03-20 11:50:51.867: I/ClipboardServiceEx(648): Send intent for dismiss clipboard dialog inside hideCurrentInputLocked() !
最佳答案
有两个原因导致它在这里不起作用
jdbc 无法访问您提供的 url,该 URL 必须可公开访问,这意味着您的服务器即:SAY x.y.z.w:port
所以需要网络人员来释放服务器 ip 上的这个端口并使其公开可用
注意
公开打开它会对您的数据库造成威胁,因为它可以被任何知道它的人写入..
忠告永远不要让您的应用程序直接与数据库通信,允许 jsp、servlet、asp、python 等服务器技术接收您的请求并为您完成。
希望对您有所帮助。
关于java - 如何从 Android 应用程序通过 JDBC 连接到远程 MySQL 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15531426/
我一直在使用 Databricks JDBC 驱动程序版本 2.6.22,并尝试升级到 2.6.27。但是,升级后我收到消息说我的 JDBC URL 在尝试连接时无效。这些 JDBC URL 与旧版本
似乎JDBC Spec没有详细说明数据源连接池中alive or idle connections的准确含义。它只是具体实现吗? DBCP2如何或 HikariCP实际检查连接状态? 下面没有事件事务
在“XPages 扩展库”一书中,第 12 章,第 409 页有一个 JDBC 连接文件的例子: org.apache.derby.jdbc.EmbeddedDriver jdbc:
谁能告诉我 jdbc 是如何工作的?它如何设法与 DBMS 通信?因为 DBMS 可能是用其他编程语言编写的。 最佳答案 与数据库的通信由 JDBC 驱动程序处理,这些驱动程序可以使用各种策略与数据库
我想知道是否有人可以帮助我解决这个问题。我在尝试使用 Spring JDBC 编写代码时遇到了一个问题。当我运行服务器时,我收到了标题中提到的消息。我google了一下,有人说你应该导入ojdbc.j
我只是想运行一个示例 hivejdbc 客户端程序,但它给我一个内存不足的错误。 import java.sql.SQLException; import java.sql.Connection; i
我需要将 Google Spreadsheet 与 JasperReports Server 一起使用,为此我需要一个用于 Google Spreadsheet 的 JDBC 连接器。 我找到了这个
我需要将大量行(最多 100,000 行)插入到 6 个不同的 DB2 表中。我正在使用 Java JDBC 来完成它。我想在单个数据库事务中完成所有操作,以便在遇到任何问题时可以回滚整个操作。在某处
再次为自己是 Jmeter 新手道歉——我对 JDBC 请求有点困惑——我在过去的 3 个小时里浏览了这个网站上的帖子——但我找不到任何相关的东西(除非我我错过了一些东西)。 我的环境:Jmeter
我们正在创建一个带有 MySQL 后端的 XPages 应用程序。应用程序将被多个客户使用。每个都有自己的 NSF 数据库和相应的 MySQL 数据库。每个客户都有自己的 MySQL 用户名。我们正在
昨天我遇到了一个大问题。在我当前的项目中,我使用 Oracle 的 JDBC 的 ojdbc6 实现进行连接,但我还需要处理例如 oracle 8 数据库,这对于这个 JAR 是完全不可能的。 你会说
这个问题在这里已经有了答案: Closing JDBC Connections in Pool (3 个答案) 关闭 2 年前。 假设我有以下代码 DataSource source = (Data
我有 Informix 数据库,时间戳字段定义为 YEAR TO SECOND。 当我使用 JDBC rs.getString(column) 显示此字段时,它使用带毫秒的格式,因此此字段如下所示:
看完本教程之后; https://www.youtube.com/watch?v=ZnI_rlrei1s 我正在尝试使用logstash和jdbc获取我的本地主机mysql(使用laravel val
有人给我小费。 { "type": "jdbc", "jdbc": { "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver"
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在尝试从mysql表中将1600万个文档(47gb)索引为elasticsearch索引。我正在使用jparante's elasticsearch jdbc river执行此操作。但是,在创建河
我正在尝试使用JDBC河将我的MySQL数据库复制到我的ElasticSearch索引中。 但是,每当我启动服务器时,与MySQL表的count(*)相比,创建的文档数量就增加了一倍。我通过清空索引并
使用新的logstash jdbc 连接器: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html后续的
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我是一名优秀的程序员,十分优秀!