问题
你好,我正在尝试在服务器插件中实现 sqlite,但我想使用与服务器提供的版本不同的版本 - 这可能吗?
我已经在我的项目中设置了 sqlite,它适用于大多数数据类型,但是由于服务器的 sqlite 版本,我无法将二进制数组写入我的数据库。服务器附带 3.7.2,但是此版本不支持 Statement#setBinaryStream,因此我想在我的项目中使用 3.8.11.2。
我无法更改服务器的 sqlite 版本,而且这个版本不太可能很快更改,所以我的解决方案是尝试在我的项目 jar 中包含一个不同的 sqlite 版本,然后使用它。我是 sqlite 的忠实粉丝,所以如果可能的话,我希望能够使用它。
我尝试过的
我尝试了以下方法:
使用 maven shade 插件将 sqlite-jdbc 库包含在我的项目中,将 org.sqlite 重定位到 me.Fupery.shaded。 sqlite
用 java.sql.DriverManager 单例注册我重新定位的驱动程序:
Driver driver = ((Driver) Class.forName("me.Fupery.shaded.sqlite.JDBC").newInstance()); DriverManager.registerDriver(driver);
像往常一样获取连接
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/