嗨,我试图在服务器插件中实现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。源码
使用 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)中的数据库吗?我在语句#setBinaryStream 之前尝试了语句#setBytes ,但我没有运气 - 没有抛出任何异常,但是我将字节设置为的列是空的
我写的here测试没有错误地返回,但是当我之后检查数据库时,"测试"每次都为空(其他数据类型工作正常):
$ SELECT * FROM test_table;
test1|
test2|
test3|
答案 0 :(得分:1)
我决定使用Statement#setBytes方法在3.7.2中写入blob,现在我已经能够正常工作了。它是一个更简单,更整洁的解决方案,同样也适用。