首页 > 解决方案 > 为什么我有这个错误?MySQLNonTransientConnectionException

问题描述

我有这个错误:>com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:无法创建与数据库服务器的连接。

这是我的代码:

public class MainActivity extends AppCompatActivity {

    private static int SIGN_IN_CODE = 1;
    private RelativeLayout activity_main;
    private FloatingActionButton sendBtn;


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == SIGN_IN_CODE) {
            if (resultCode == RESULT_OK) {
                Snackbar.make(activity_main, "Вы авторизованы!", Snackbar.LENGTH_LONG).show();
                //displayAllMessages();
            } else {
                Snackbar.make(activity_main, "Вы не авторизованы!", Snackbar.LENGTH_LONG).show();
                finish();
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activity_main = findViewById(R.id.activity_main);
        sendBtn = findViewById(R.id.btnSend);


        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EditText textField = findViewById(R.id.messageField);

                if (textField.getText().toString().equals(""))
                    return;

                //SQL

                //String connectionStr = "jdbc:mysql://109.95.210.183:3306/u86855_wp11";
                String connectionStr = "jdbc:mysql://localhost:3306/app";
                //String insert = "INSERT INTO u86855_wp11(nick, message) VALUES('lax','petro')";
                String insert = "INSERT INTO users(nick, message) VALUES('lax','petro')";
                try {

                    Object mysql = Class.forName("com.mysql.jdbc.Driver").newInstance();
                    //Connection dbConnection = DriverManager.getConnection(connectionStr,"u86855_wp11", "SchoolApp");
                    Connection dbConnection = DriverManager.getConnection(connectionStr, "SchoolApp", "SchoolApp");
                    Statement statement = dbConnection.createStatement();
                    ResultSet resultSet = statement.executeQuery(insert);
                } catch (Exception e) {
                    textField.setText(e.toString());
                    Log.e("Ошибка", "database", e);
                }


                // textField.setText("");
            }

        });

        if (FirebaseAuth.getInstance().getCurrentUser() == null)
            startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().build(), SIGN_IN_CODE);
        else {
            Snackbar.make(activity_main, "Вы авторизованы!", Snackbar.LENGTH_LONG).show();
            //displayAllMessages();
        }
    }

    private void displayAllMessages() {
    }
    
}

这是我的错误日志:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2266)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2015)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:323)
    at java.sql.DriverManager.getConnection(DriverManager.java:569)
    at java.sql.DriverManager.getConnection(DriverManager.java:219)
    at com.example.databasetest.MainActivity$1.onClick(MainActivity.java:81)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448)
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:102)
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:90)
    at java.net.InetAddress.getAllByName(InetAddress.java:787)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:188)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:299)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2187)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2220)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2015) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
    at java.lang.reflect.Constructor.newInstance0(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:334) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:403) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:323) 
    at java.sql.DriverManager.getConnection(DriverManager.java:569) 
    at java.sql.DriverManager.getConnection(DriverManager.java:219) 
    at com.example.databasetest.MainActivity$1.onClick(MainActivity.java:81) 
    at android.view.View.performClick(View.java:6256) 
    at android.view.View$PerformClick.run(View.java:24701) 
    at android.os.Handler.handleCallback(Handler.java:789) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6541) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

标签: javaandroidmysql

解决方案


主要问题是在线

Caused by: android.os.NetworkOnMainThreadException在您的错误日志中。

当您尝试在主线程上进行网络调用时会发生这种情况。您应该为此使用 Async 任务或 Rxjava 或任何其他方法。

另一种方法可以在 setcontent 视图之后将此代码粘贴到您的主要活动中。

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new 
    StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    }

并将其导入您的活动文件

import android.os.StrictMode;


推荐阅读