使用DataSource和(Xerial) sqlite-jdbc驱动连接SQLite

11

Java教程中提到了通过JDBC连接数据库的两种方式:使用DriverManager类(旧版,不推荐)和使用DataSource类。

我了解如何使用DriverManager进行连接:

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

但我找不到如何通过JDBC使用SQLite的DataSource。 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 driver/jar是否支持DataSource语法,或者给出如何使用的示例,或者建议其他支持DataSource的驱动程序(用于Java的SQLite),或者提供建议...

Java教程

JDBC驱动管理器 — JDBC DriverManager类定义了能够将Java应用程序连接到JDBC驱动程序的对象。DriverManager一直是JDBC架构的支柱。它非常小而简单。

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

1个回答

9
我最好的猜测是我将使用org.sqlite.SQLiteDataSource类(它在Xerial sqlite-jdbc驱动程序的sqlite-jdbc-3.15.1.jar中),但是如何使用呢?我只是尝试了以下代码,并且它对我有效:
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);
        }
    }

}

1
我需要使用 ds.setUrl("jdbc:sqlite:/path/to/table.sqlite"); 来使其与我的数据库配合工作。 - dreua
@dauer - 你是说 ds.setDatabaseName("/path/to/table.sqlite"); 对你没有起作用吗? - Gord Thompson
1
是的,setDatabaseName(...) 命令对我不起作用,我刚刚尝试了完整路径和相对路径:我总是会得到一个错误(https://pastebin.com/uDYXRmHG)。 - dreua
1
请注意,我已更改代码以从先前存储在文件中的表中读取。如果我从sqlite_master读取,它总是有效的。(我猜使用setDatabaseName只会创建一个新的内存数据库,而不是访问文件。) - dreua
1
@dauer - 哦,我明白你的意思了。谢谢指正。我已经更新了答案。 - Gord Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接