java - 如何在单个 java 服务器上加载多个 sqlite 驱动程序版本?

标签 java sqlite maven jdbc

问题

你好,我正在尝试在服务器插件中实现 sqlite,但我想使用与服务器提供的版本不同的版本 - 这可能吗?

我已经在我的项目中设置了 sqlite,它适用于大多数数据类型,但是由于服务器的 sqlite 版本,我无法将二进制数组写入我的数据库。服务器附带 3.7.2,但是此版本不支持 Statement#setBinaryStream,因此我想在我的项目中使用 3.8.11.2。

我无法更改服务器的 sqlite 版本,而且这个版本不太可能很快更改,所以我的解决方案是尝试在我的项目 jar 中包含一个不同的 sqlite 版本,然后使用它。我是 sqlite 的忠实粉丝,所以如果可能的话,我希望能够使用它。

我尝试过的

我尝试了以下方法:

  1. 使用 maven shade 插件将 sqlite-jdbc 库包含在我的项目中,将 org.sqlite 重定位到 me.Fupery.shaded。 sqlite

  2. java.sql.DriverManager 单例注册我重新定位的驱动程序:

    Driver driver = ((Driver) Class.forName("me.Fupery.shaded.sqlite.JDBC").newInstance());
    DriverManager.registerDriver(driver);
    
  3. 像往常一样获取连接

    Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbFileURL);
    

但是没有运气! lib 正确地包含在我的 jar 中,并且注册驱动程序的代码(上面)运行时没有异常,但是当我尝试编写字节流时,它像往常一样抛出 AbstractMethodError (表明它使用的是旧版本,而不是旧版本我加载了)。

有没有办法指定在建立连接时使用哪个驱动程序?我查看了 DriverManager 和 Driver 方法,但找不到我可以使用的任何东西。

替代方法

或者,是否有另一种方法可以用来将 blob 写入服务器提供的 sqlite 版本 (3.7.2) 中的数据库?我在 Statement#setBinaryStream 之前尝试了 Statement#setBytes,但我没有任何运气 - 没有抛出异常,但我将字节设置为的列是空的。

我写的一个测试here返回没有错误,但是当我之后检查数据库时,“测试”列每次都是空的(其他数据类型工作正常):

$ SELECT * FROM test_table;
test1|
test2|                           
test3|

最佳答案

我决定在 3.7.2 中使用 Statement#setBytes 方法来写入 blob,现在我已经能够让它正常工作了。这是一个更简单、更整洁的解决方案,而且效果也很好。

关于java - 如何在单个 java 服务器上加载多个 sqlite 驱动程序版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39359521/

相关文章:

java - Maven ArtifactNotFoundException 故障排除

java - 如何将 offsetTime 添加到 UTC 时间以获得正确的 ZonedDateTime?

java - 使用 Java 中的 Tumblr API 发布视频

java - 分层存储常量的最佳实践

android - 如何在 fragment 中更新 SQLite 数据库?安卓

java - Netbeans 使用 pom.xml (Maven) 而不是 build.gradle (Gradle)

java - 如何以jsp页面而不是xml格式显示solr的结果?

android - SherlockFragmentActivity 与多个 ListFragments 和 SQLite 游标战斗

sqlite - Android 测试 - 从每个测试的干净数据库开始

mysql - 为 MySQL 构建 ODK 聚合