获取java.lang.ClassNotFoundException:Java中的java:comp / env / jdbc / oracleInstance吗?

时间:2018-12-03 19:08:27

标签: java apache-poi

由于某种原因我无法连接到数据库,因此出现错误: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 :(得分:2)

字符串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/