我应该测试使用JDBC在Postgres数据库中存储PDF文件的不同方法。目前我正在尝试使用BYTEA。存储文件没有问题,但检索速度非常慢。
我正在处理几个大约3MB的文件。存储它们大约需要3秒钟(总计),这样就可以了。但是当我尝试检索它们时,在DB中有多少文件的输出和实际开始创建文件的程序之间需要大约2分钟。一旦启动,它只需要大约5秒钟即可完成。为什么Postgres花了这么长时间来查询" SELECT文件......" ?当我使用pgAdmin时,查询需要相同的时间。不检索文件大小并没有改变任何东西。
据我了解,数据库使用TOAST来分割我的文件,当我想要检索它们时,它首先要将它们重新组合在一起。但是,由于拆分它们(上传时)只需要几秒钟,将它们重新组合起来不应该花那么长时间,对吧?
以下是一些代码段:
public void saveToDB(Files[] files) {
try (PreparedStatement s = con.prepareStatement("INSERT INTO fileTable (filename, file) VALUES (?,?)")) {
for (File f : files) {
System.out.println(f.getName()+" (" + f.length() / 1024 + "KB)");
s.setString(1, f.getName());
s.setBinaryStream(2, new FileInputStream(f), f.length());
s.executeUpdate();
}
con.commit();
}
}
public void getFromDB(File dir) {
dir.mkdirs();
try (Statement s = con.createStatement(); ResultSet rs = s.executeQuery("SELECT COUNT(*) FROM useByteA")) {
rs.next();
System.out.println("Files: " + rs.getInt(1));
}
try (Statement s = con.createStatement(); ResultSet rs = s.executeQuery("SELECT length(file), filename, file FROM fileTable")) {
while (rs.next()) {
System.out.println(rs.getString(2)+" (" + rs.getInt(1) / 1024 + "KB)");
File f = new File(dir, filename);
f.createNewFile();
try (FileOutputStream out = new FileOutputStream(f)) {
out.write(rs.getBytes(3));
out.flush();
}
}
}
}