【问题标题】:Using DataSource to connect to SQLite with (Xerial) sqlite-jdbc driver使用 DataSource 通过 (Xerial) sqlite-jdbc 驱动程序连接到 SQLite
【发布时间】:2017-05-04 22:56:41
【问题描述】:

Java Tutorial 说有两种方法可以通过 JDBC 连接到数据库:使用 DriverManager 类(旧的,不推荐)和使用 DataSource 类。

我不知道如何使用 DriverManager:

Connection con = DriverManager.getConnection("jdbc:sqlite:mytest.db");
...

但我找不到如何通过 JDBC 使用 DataSource for SQLite。 SQLite(或它的 JDBC 驱动程序提供程序,我不知道如何正确调用它)是否支持使用 DataSource?

我正在使用 xerial/sqlite-jdbc 驱动程序来使用 java 中的 SQLite (https://github.com/xerial/sqlite-jdbc)

我最好的猜测是我将使用 org.sqlite.SQLiteDataSource 类(它在 sqlite-jdbc-3.15.1.jar 中用于 Xerial sqlite-jdbc 驱动程序),但是如何使用呢?是这样吗?我也猜想,如何做到这一点应该在 Xerial 驱动程序文档中,但他们只给出了如何使用 DriverManager 进行连接的示例。

所以我请求大师的帮助以确认 this Xerial 驱动程序/jar 不支持 DataSource 语法,或者举例说明如何做到这一点,或者建议支持 DataSource 的替代驱动程序(对于来自 Java 的 SQLite),或其他建议......

Java Tutorial

JDBC DriverManager — JDBC DriverManager 类定义对象 它可以将 Java 应用程序连接到 JDBC 驱动程序。驱动管理器 传统上一直是 JDBC 架构的支柱。它是 很小很简单。

标准扩展包 javax.naming 和 javax.sql 让您可以使用 使用 Java 命名和目录注册的 DataSource 对象 Interface™ (JNDI) 命名服务,用于建立与数据的连接 资源。您可以使用任一连接机制,但使用 尽可能推荐使用 DataSource 对象。

【问题讨论】:

    标签: java sqlite jdbc datasource


    【解决方案1】:

    我最好的猜测是我将使用 org.sqlite.SQLiteDataSource 类(它在 sqlite-jdbc-3.15.1.jar 中用于 Xerial sqlite-jdbc 驱动程序),

    是的,这似乎很有可能。

    但是怎么做呢?

    我刚刚尝试了以下方法,它对我有用:

    package com.example.sqlite.sqlite_test;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.sqlite.SQLiteDataSource;
    
    public class SqliteTestMain {
    
        public static void main(String[] args) {
            SQLiteDataSource ds = new SQLiteDataSource();
            ds.setUrl("jdbc:sqlite::memory:");
            try (Connection conn = ds.getConnection()) {
                System.out.println("Connected.");
                String sql = 
                        "SELECT COUNT(*) AS n FROM \"sqlite_master\"";
                try (
                        Statement s = conn.createStatement();
                        ResultSet rs = s.executeQuery(sql)) {
                    rs.next();
                    System.out.printf(
                            "The \"sqlite_master\" table contains %d row(s).%n", 
                            rs.getInt(1));
                }
            } catch (SQLException e) {
                e.printStackTrace(System.err);
            }
        }
    
    }
    

    【讨论】:

    • 我需要ds.setUrl("jdbc:sqlite:/path/to/table.sqlite"); 才能使其与我的数据库一起使用。
    • @dauer - 你是说ds.setDatabaseName("/path/to/table.sqlite"); 不适合你吗?
    • 是的,setDatabaseName(...) 命令对我不起作用,我只是用完整路径和相对路径再次尝试:我总是收到错误 (pastebin.com/uDYXRmHG)。
    • 请注意,我将代码更改为从先前存储在文件中的表中读取。如果我从 sqlite_master 读取它总是有效的。 (我猜使用 setDatabaseName 只是在内存数据库中创建一个新的数据库,而不是访问文件。)
    • @dauer - 啊哈。我明白你的意思了。感谢您的指正。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2020-03-08
    • 2017-10-24
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多