Получение java.lang.ClassNotFoundException: java: comp / env / jdbc / oracleInstance в Java? - PullRequest
0 голосов
/ 03 декабря 2018

По какой-то причине я не могу подключиться к своей базе данных, поэтому я получаю сообщение об ошибке: java.lang.ClassNotFoundException: java:comp/env/jdbc/oracleInstance, и у меня есть класс DataUtility, где я подключаюсь без проблем.Но в моем методе ниже, начиная с Class.forName, начинается ошибка.Может ли кто-нибудь помочь мне решить эту проблему.спасибо!

Вот мой код:

public void exportExcel() throws SQLException, Exception {

Class.forName("java:comp/env/jdbc/oracleInstance");
Connection connect = DriverManager.getConnection(
    "java:comp/env/jdbc/oracleInstance",
    "root",
    "root"
);


Statement statement = connect.createStatement();
ResultSet resultSet = statement.executeQuery("select * from myBean.va_v_vPay");
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet spreadsheet = workbook.createSheet("test db");

XSSFRow row = spreadsheet.createRow(1);
XSSFCell cell;
cell = row.createCell(1);
cell.setCellValue("CLASS");
cell = row.createCell(2);
cell.setCellValue("GRADE");


int i = 2;

while (resultSet.next()) {
    row = spreadsheet.createRow(i);
    cell = row.createCell(1);
    cell.setCellValue(resultSet.getInt("Class"));
    cell = row.createCell(2);
    cell.setCellValue(resultSet.getString("Grade"));

    i++;
}

FileOutputStream out = new FileOutputStream(new File("all_file.xls"));
workbook.write(out);
out.close();
System.out.println("all_file.xls written successfully");

}

DataUtility:

    @ManagedBean(name = "dataUtility")
@ApplicationScoped
public final class DataUtility {

    private final JdbcTemplate jdbcTemplate;

    public DataUtility() throws NamingException {
        this.jdbcTemplate = new JdbcTemplate(DataUtility.getDataSource());
    }

    private static DataSource getDataSource() throws NamingException {
        Context ctx = new InitialContext();
        DataSource ds;

        try {
            ds = (DataSource) ctx.lookup("java:comp/env/jdbc/oracleInstance");
        } catch (Exception e) {
            System.out.println("FATAL ERROR: " + e.toString());
            throw new NamingException(e.toString());
        }
        return ds;
    }

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }
}

1 Ответ

0 голосов
/ 03 декабря 2018

Строка java:comp/env/jdbc/oracleInstance является именем JNDI.Class.forName ожидает полное имя класса Java (предположительно, класса, реализующего интерфейс драйвера JDBC).

Если вы используете Tomcat или какой-либо другой сервер приложений, вам не нужно использоватьClass.forName себя.Вместо этого контейнер можно настроить для предоставления вам пула соединений с БД, который вы можете искать с помощью JNDI:

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

Если вы используете автономное приложение Java, то вы не можете использоватьJNDI, и вам нужно будет самостоятельно посмотреть драйвер и соединение с БД:

https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html

Похоже, вы также используете Spring, который имеет свои собственные абстракции JDBC и утилиты, которые могут помочьвы получаете соединение с БД:

https://spring.io/guides/gs/relational-data-access/

...