mySQL 安卓工作室。 java.sql.SQLNonTransientConnectionException:无法创建到数据库服务器的连接

时间:2021-04-05 00:00:22

标签: android mysql android-studio kotlin

我正在尝试将 MySQL 与 android studio 一起用于学校应用程序。我只有在使用模拟器运行时才能运行命令。在单独的文件中,命令工作正常,并且没有崩溃。我知道使用 mySQL 可能不是最好的主意,但我的团队没有太多其他选择。

import java.sql.DriverManager
import java.sql.SQLException
fun getData(): Array<String> {
    // val url = "jdbc:mysql://localhost:3306/Stonks"
    val url =
        "jdbc:mysql://localhost:3306/Stonks?verifyServerCertificate=false&useSSL=false"
    val user = "Shane"
    val password = "pass"

    try {
        //it fails on this line
        val myCon = DriverManager.getConnection(url, user, password)

错误列表:

<块引用>

W/System.err: java.sql.SQLNonTransientConnectionException: 无法创建到数据库服务器的连接。 在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) 在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) 在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) 在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) 在 com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1006) 在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:823) 在 com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:453) 在 com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) 在 com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) 在 java.sql.DriverManager.getConnection(DriverManager.java:580) 在 java.sql.DriverManager.getConnection(DriverManager.java:218) 在 com.example.fantasystocks1.MainActivity.getData(MainActivity.kt:94) 在 com.example.fantasystocks1.ui.Search.SearchFragment.onCreateView(SearchFragment.kt:34) 在 androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698) 在 androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320) 在 androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187) 在 androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224) 在 androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997) 在 androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953) 在 androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) 在 androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7660) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975) 引起:android.os.NetworkOnMainThreadException 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1605) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436) 在 java.net.Socket.connect(Socket.java:621) 在 com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) 在 com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) W/System.err: 在 com.mysql.cj.NativeSession.connect(NativeSession.java:144) 在 com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:953)

1 个答案:

答案 0 :(得分:1)

这是在您的日志中:

Caused by: android.os.NetworkOnMainThreadException

您无法在 UI 或主线程上连接到您的数据库,请使用单独的线程、ansynctask 等。在此 post

中了解更多信息

这是一个丑陋的解决方案,把它放在DriverManager.getConnection()

之前

科特林:

val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)

Java:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);