美文网首页程序员
Android: 仅真机调试时出现的JDBC错误:java.la

Android: 仅真机调试时出现的JDBC错误:java.la

作者: 魔娃 | 来源:发表于2019-03-11 00:40 被阅读0次

    背景

    这是寒假里刚开始学习Android遇到的问题,困扰了我三天的时间,期间痛苦无比,心情一波三折,包括百度无果后的沮丧,Google发现StackOverFlow上有一个小兄弟遇到跟我完全一致问题的期待,再到注意到问题0 answer后的绝望。最后碰巧解决问题后兴奋地几欲奔走……大概这就是人生吧!

    问题描述

    报错内容:

    01-21 22:53:48.713 5823-5946/com.stellaris.practice E/AndroidRuntime: FATAL EXCEPTION: Thread-5
        Process: com.stellaris.practice, PID: 5823
        java.lang.UnsupportedOperationException
            at java.util.regex.Matcher.group(Matcher.java:383)
            at com.mysql.cj.conf.ConnectionUrlParser.isConnectionStringSupported(ConnectionUrlParser.java:152)
            at com.mysql.cj.conf.ConnectionUrl.acceptsUrl(ConnectionUrl.java:258)
            at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:195)
            at java.sql.DriverManager.getConnection(DriverManager.java:569)
            at java.sql.DriverManager.getConnection(DriverManager.java:219)
            at com.stellaris.functions.DBUtils.getConnection(DBUtils.java:21)
            at com.stellaris.functions.DBUtils.getUserInfoByName(DBUtils.java:33)
            at com.stellaris.practice.LoginActivity$2.run(LoginActivity.java:91)
            at java.lang.Thread.run(Thread.java:760)
    

    报错代码

    try {
          Class.forName("com.mysql.cj.jdbc.Driver"); 
          conn = DriverManager.getConnection("jdbc:mysql://XXX.XX.XXX.XXX:3306/androidapp","XXX", "XXXXX");
     }
    

    也就是通过JDBC直接连接开放端口的服务器时报的错,然而奇诡的是,在PC端写测试代码可以运行

    import java.sql.DriverManager;
    
    public class test {
        private static String ip = "XXX.XXX.XXX.XXX";
        private static String dbname = "XXX";
        private static String url = "jdbc:mysql://" + ip + "/"+ dbname ;
        private static String driver = "com.mysql.cj.jdbc.Driver";
        private static String username = "XXX";
        private static String password = "XXXXXX";
    
        public static void main(String[] args) throws Exception {
            Class.forName(driver).newInstance();
            System.out.println(DriverManager.getConnection(url, username, password));
    
        }
    }
    

    这段代码是可以直接输出服务器返回的值的。追踪报错的代码,由于水平有限也毫无成果,期间Debug过程也毫无头绪,最终碰巧解决了,那么废话不多说。

    解决办法

    正常debug毫无头绪,我就打算降低jdbc版本,最终经过几次版本的尝试,把原先依赖的
    mysql-connector-java-8.0.12.jar
    上maven下载了低版本,替换成了
    mysql-connector-java-5.1.47.jar
    问题就神奇的解决了……
    事后回想起来,服务器的mysql是购置腾讯云的时候自带的,应该也是5.x版本,高版本的mysql-jdbc很可能有兼容问题……主要是在PC端测试没有问题没让我往版本那块儿想。总之经验就是解决依赖问题,版本也是一个重要的因素。
    这个问题在百度上从没见过,也贡献了我在StackOverFlow的首答,其实我很想问问那个跟我提了一样问题的小兄弟是怎么解决的。总之希望能帮助同样被这个问题困扰的同学(应该没有)。

    相关文章

      网友评论

        本文标题:Android: 仅真机调试时出现的JDBC错误:java.la

        本文链接:https://www.haomeiwen.com/subject/kjmmpqtx.html