java.lang.ClassCastException: класс com.mysql.cj.jdbc.ConnectionImpl не может быть приведен к - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь настроить микро сервис для моего школьного проекта.Я использую Java загрузочный фреймворк.Но когда я скомпилировал и запустил соединение с БД, он выдал ошибку: java.lang.ClassCastException: класс com.mysql.cj.jdbc.ConnectionImpl не может быть приведен к классу com.hrms.employees.db.Connection (com.mysql.cj.jdbc.ConnectionImpl и com.hrms.employees.db.Connection находятся в неназванном модуле загрузчика 'app')

package com.hrms.employees.db;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Connection {
    private static Connection conn;

    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = (Connection) DriverManager.getConnection("jdbc:mysql://itsatest2.c45g5gg8tx2m.ap-southeast-1.rds.amazonaws.com","admin","zx55774463");
            System.out.println("connected");
        }
        catch(ClassNotFoundException | SQLException e){
            System.out.println(e.getMessage());
        }
    }

    public static Connection getConnection(){
        return conn;
    }

}

зависимость в grade.build

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'
}

Я ожидаювыходная строка «подключена»

1 Ответ

1 голос
/ 28 сентября 2019

Проблема в том, что ваш класс называется Connection, а DriverManager.getConnection() возвращает java.sql.Connection.При использовании MySQL Connector / J фактическая возвращаемая реализация - com.mysql.cj.jdbc.ConnectionImpl, и это явно не экземпляр вашего класса com.hrms.employees.db.Connection, поэтому приведение не выполняется.

Вам нужно либо переименовать свой класс, либо вынеобходимо определить вашу переменную как private static java.sql.Connection conn и удалить приведение (поэтому используйте conn = DriverManager.getConnection).

В качестве отступления, использование статической переменной для соединения с базой данных почти всегда является неправильным решением, в долго работающих приложенияхэто может вызвать проблемы, когда соединение закрыто или потеряно, а в приложениях с высокой степенью одновременности это приводит к совместному использованию одного соединения между несколькими потоками, что может привести к состязанию или другим трудным для диагностики ошибкам.

Лучшее решение было быиспользовать источник данных пула соединений, такой как Apache DBCP, c3p0 или HikariCP, и получить соединение только для единицы работы, а затем закрыть его (что возвращает его в пул для повторного использования).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...