首页 > 解决方案 > 连接到基于文件的 hsql 给出 null

问题描述

我在通过 jdbc 连接到基于文件的 hsqldb 时遇到问题。这是我的道课

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class EventDao {
    private static final String URL = "jdbc:hsqldb:file:C:/Applications/CreditTask/db";
    private static final String USER = "sa";
    private static final String PASS = "";
    private Connection connection;

public EventDao() {
    try {
        Class.forName("org.hsqldb.jdbc.JDBCDriver");
        connection = DriverManager.getConnection(URL, USER, PASS);
        dropAndCreateTable();
    } catch (SQLException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

private void dropAndCreateTable() throws SQLException {
    final String dropSql = "drop table event";
    PreparedStatement preparedStatement = connection.prepareStatement(dropSql);
    preparedStatement.execute();
    final String createSql = "create table event(\n" +
            "    id int not null,\n" +
            "    state varchar(10) not null,\n" +
            "    timestamp int not null,\n" +
            "    type varchar(15),\n" +
            "    host varchar(15),\n" +
            "    alert boolean\n" +
            ")";
    preparedStatement = connection.prepareStatement(createSql);
    preparedStatement.execute();
}

public void save(Event event) {
    final String sql = "insert into event(id,state,timestamp,type,host,alert) values (?,?,?,?,?,?)";
    try {
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1, event.getId());
        preparedStatement.setString(2, event.getState());
        preparedStatement.setString(3, event.getTimestamp().toString());
        preparedStatement.setString(4, event.getType());
        preparedStatement.setString(5, event.getHost());
        preparedStatement.setString(6, event.getAlert().toString());
        preparedStatement.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public void close() {
    try {
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

}

这是我使用它的地方

public class EventParser {

private static final String FILE_NAME = "log.json";
private static final String STARTED = "STARTED";
private static final String FINISHED = "FINISHED";
private static final Long MAX_ALERT_RANGE = 4L;
private static final Logger logger
        = LoggerFactory.getLogger(EventParser.class);

public static void main(String[] args) {
    EventParser eventParser = new EventParser();
    eventParser.runApp();
}

public void runApp() {
    try {
        EventDao eventDao = new EventDao();
        logger.info("Reading events from file");
        Map<String, EventWrapper> eventsFromFile = readEventsFromFile();
        List<Event> eventsToSave = calculateEventTime(eventsFromFile);
        //2h in this state i didn't test saving to db using eventDao
        for (Event event : eventsToSave) {
            Runnable runnable = () -> eventDao.save(event);
            runnable.run();
        }
        eventDao.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
//rest of the class are methods that giving me arrays of events

问题是当我运行此应用程序时出现错误:

java.lang.ClassNotFoundException: org.hsqldb.jdbc.JDBCDriver
at 

java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:332)
at event.EventDao.<init>(EventDao.java:19)
at event.EventParser.runApp(EventParser.java:32)
at event.EventParser.main(EventParser.java:27)

我阅读了文档并检查了我是否下载了库,但一切似乎都很好。你有什么想法为什么我在连接中得到空值?这个应用程序还有什么改进,我每次通过 dao 构造函数运行应用程序时都不需要使用 drop 和 create table?

标签: javadatabasegradlejdbchsqldb

解决方案


当调用Class.forName("org.hsqldb.jdbc.JDBCDriver")抛出异常时,这意味着执行命令hsqldb.jar时它不包含在类路径中。java ...


推荐阅读