所以我已经和这个开关斗争了几天,感觉好像我已经用尽了所有相关的搜索词。首先,我要说的是,我对此做了很多研究,但都无济于事;我得出的结论是,这要么是非常不正常(不太可能)的事情,要么是我在某种程度上忽略了一些微小的细节。我还要马上说,是的,我知道直接从应用程序连接到数据库并不理想,我应该使用web服务器,但就我的意图和目的而言,这个解决方案不是问题。
我知道这篇文章很长,但我非常感谢大家的时间。如果没有别的,至少它可能会帮助最近开始使用JDBC并开始遇到问题的其他人。“我尝试过的”部分概述了您可以在网上找到的绝大多数尝试的事情。
我想做的是:
使用JDBC驱动程序,通过Android Studio连接到我的Azure托管SqlServer数据库。
我遇到的错误是:
W/System.err: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host vet-to-go.database.windows.net, port 1433 has failed. Error: "Connection timed out: no further information. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
我尝试/验证过的(简短列表):
-连接代码发生在活动类中,但它在异步任务中。
-使用权限android:name=“android.permission.INTERNET”
-Azure防火墙配置为允许我的IP连接。
-Windows防火墙有允许传入的规则
-在SQLServer配置管理器中,我启用了命名管道
-尝试SQL服务器浏览器都运行
-已经尝试过使用两种jre7
-Source兼容性
-编译文件('libs/sqljdbc41.jar')[或jre8的42]
-更令人绝望的是,为了确保它们不是问题所在,在完全关闭Windows Firewall并允许任何IP通过Azure Firewall连接(起始/结束IP为0.0.0-255.255.255)后,我也未能连接
-我可以平
考虑到以上所有因素,我只能假设错误在我的代码中的某个地方,但我绝对不知道在哪里。为了给棺材钉上钉子,应该提到的是,我能够成功地查询数据库
以下是工作代码:
import java.sql.*;
public class DatabaseHelper {
public static void main(String[] args) throws Exception {
String custID = "1";
String connectionString = "jdbc:sqlserver://vet-to-go.database.windows.net:1433;database=Vet To Go DB;user=myLogin@vet-to-go;password=myPass;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
String queryString = "SELECT FirstName, LastName FROM Tbl_Customer WHERE CustomerID = " + custID;
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection myConnection = DriverManager.getConnection(connectionString);
Statement myStatement = myConnection.createStatement();
ResultSet myResultSet = myStatement.executeQuery(queryString);
myResultSet.next();
String firstName = myResultSet.getString("FirstName");
String lastName = myResultSet.getString("LastName");
System.out.println(firstName);
System.out.println(lastName);
myStatement.close();
myConnection.close();
}
}
我知道有些代码看起来很奇怪,只是因为我希望将其合并到另一个类中。这是我最近的一次尝试(正如我提到的,我已经尝试了一段时间,所以我尝试了几种不同的组合)
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.sql.*;
public class LandingPage extends AppCompatActivity {
TextView txtFirst, txtLast;
String firstName, lastName, customerID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_landing_page);
txtFirst = (TextView)findViewById(R.id.txtFirstName);
txtLast = (TextView)findViewById(R.id.txtLastName);
customerID = getIntent().getStringExtra("custID");
new myAsyncTask(LandingPage.this).execute();
txtFirst.setText(firstName);
txtLast.setText(lastName);
}
public class myAsyncTask extends AsyncTask<Void, Void, String> {
String connectionString = "jdbc:sqlserver://vet-to-go.database.windows.net:1433;database=Vet To Go DB;user=myLogin@vet-to-go;password=myPass;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
String queryString = "SELECT FirstName, LastName FROM Tbl_Customer WHERE CustomerID = " + customerID;
Context context;
public myAsyncTask(Context context) {
System.out.println("Async instantiated.");
this.context = context;
}
protected void onPreExecute() {
System.out.println("Pre-executing Async task.");
}
protected String doInBackground(Void... params) {
try {
System.out.println("Attempting to connect to DB...");
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection(connectionString);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(queryString);
while (rs.next()) {
System.out.println("Sorting through ResultSet...");
firstName = rs.getString("FirstName");
lastName = rs.getString("LastName");
}
} catch (SQLException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
return "Complete";
}
protected void onPostExecute(String result) {
if (result.equals("Complete")) {
System.out.println("Async task complete.");
}
}
}
}
运行上述代码后,我得到“到主机vet-to-go.database.windows.net的TCP/IP连接,端口1433已失败。”此行出现错误:
Connection con = DriverManager.getConnection(connectionString);
我认为这并不重要,但为了以防万一,以下是目前主要活动中的所有内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etID = (EditText)findViewById(R.id.etCustID);
btnSubmit = (Button)findViewById(R.id.btnSubmit);
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
customerID = etID.getText().toString();
myIntent = new Intent(MainActivity.this, LandingPage.class);
myIntent.putExtra("custID", customerID);
startActivity(myIntent);
}
});
}
Android Studio 2.3
建造#AI-162.3764568,建造于2017年2月24日
JRE:1.8.0_112-release-b06 amd64
JVM:JetBrains s.r.o的OpenJDK 64位服务器虚拟机
Gradle版本3.3
目标API 22:Android 5.1
Min Sdk V 21
构建工具V25.0.0
首先,在Android上直接连接Azure SQL数据库不是个好主意。通常,推荐的方法是通过调用一些REST API来访问数据库,这些API可以在Azure上创建为Web应用或移动应用。
其次,许多现有的SO线程与您的问题类似,一个解决方案是在Android上使用jTDS
驱动程序而不是MS SQL Server驱动程序sqljdbc
进行连接,因为Android上似乎不完全支持sqljdbc
驱动程序。作为参考,请参阅以下已解析的线程。
希望有帮助。
我在连接到公共托管的静态IP mysql服务器时遇到了一个奇怪的问题。 我能够使用MySQL Workbench成功连接到服务器,也可以通过SSH连接到本地远程服务器。但是从jdbc连接器连接到mysql服务器的尝试(通过NetBeans和本地部署的代码都失败)。在查看日志时,代码正在尝试与远程服务器连接,考虑到用户凭据是本地用户而不是远程用户的。因此用户存在于远程,但java在尝试连接时会考虑u
尝试创建一个简单的Jmeter 5.0测试,以使用JDBC连接配置连接到数据库。它无法连接到我本地的mySql数据库。[jdbc:mysql://localhost:3306]。我可以使用mySql工作台连接到我本地的mySql数据库,所以我知道我可以连接到它。 它似乎在方法上失败。 你有什么想法为什么会发生这种情况吗? 我在apache-jmeter-5.0\bin中尝试了不同的mysql-co
我想连接Java类文件与SQL server 2012。我已通过SQL server身份验证登录。但我接收到连接错误。 错误:到主机127.0.0.1端口1433的TCP/IP连接失败。错误:“连接拒绝:连接。验证连接属性。确保主机上正在运行SQL Server实例并接受端口上的TCP/IP连接。确保到端口的TCP连接没有被防火墙阻止。” 我的代码---
有人尝试过将jmeter连接到azure mongodb吗。我尝试连接模拟器,但无法连接,也没有收到任何错误。或者知道Jmeter是否支持与azure mongodb的连接? 检查azure留档:它指出连接字符串应该是这样的。
问题内容: 我有一个使用JDBC连接到MySQL的应用程序。在某些情况下,JDBC连接空闲数小时(甚至几天),并且失去与MySQL的连接,然后尝试执行查询时除外。最好的解决方案是什么? 问题答案: 保持连接打开时间不足是一个坏习惯。当数据库打开时间过长时,它将强制关闭。您应该编写JDBC代码,以便它总是在您获取它们的同一块块中关闭连接(以及语句和结果集),以防止这样的资源泄漏。 但是,获取每个连接