使用 DataSource 通过 (Xerial) sqlite-jdbc 驱动程序连接到 SQLite

Posted

技术标签:

【中文标题】使用 DataSource 通过 (Xerial) sqlite-jdbc 驱动程序连接到 SQLite【英文标题】:Using DataSource to connect to SQLite with (Xerial) sqlite-jdbc driver 【发布时间】: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 对象。

【问题讨论】:

【参考方案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 - 啊哈。我明白你的意思了。感谢您的指正。我已经更新了答案。

以上是关于使用 DataSource 通过 (Xerial) sqlite-jdbc 驱动程序连接到 SQLite的主要内容,如果未能解决你的问题,请参考以下文章

CachedRowSet 和 SQLite JDBC 驱动程序

Javasqlite数据库

LINUX下载编译sqlite-jdbc(支持mips64el/loongarch64的jar包下载)

配置hibernate 4通过tomcat 7中的JNDI Datasource连接数据库

学习Spring-Data-Jpa(二十一)---DataSource与JPA属性配置

通过反射获取DataSource里数据源的账号密码