【问题标题】:Connection to file-based hsql giving null连接到基于文件的 hsql 给出 null
【发布时间】:2019-12-03 05:56:14
【问题描述】:

我在通过 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?

【问题讨论】:

    标签: java database gradle jdbc hsqldb


    【解决方案1】:

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

    【讨论】:

    • 我在外部库中有它。 hsqldb-2.4.1.jar。我正在使用带有这样的代码的 gradle plugins { id 'java' } group 'CreditTask' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8' compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3' testCompile group: 'org.hsqldb', name: 'hsqldb', version: '2.4.1' }
    • 问题在于运行代码,而不是使用 gradle 构建。
    • 问题实际上出在 gradle 上。我正在使用 testCompile hsqldb,应该可以编译。更改后驱动和连接没有问题。
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2015-11-13
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多