我正试图找出使用Hibernate在mysql数据库中保存/检索文件的'正确',故障保护方法。该解决方案必须处理非常大的文件,因此最小化内存占用将非常重要。
我的解决方案,到目前为止:
包含java.sql.Blob字段的模型类,getter用“@Lob”注释。
public static void main(String[] args) {
DAOFactory factory = DAOFactory.getFactory();
IResultExtraDAO resultExtraDAO = factory.getResultExtraDAO();
factory.getResultExtraDAO().beginTransaction();
ResultExtra resultExtra = new ResultExtra();
LobHelper lh = HibernateUtil.getSession().getLobHelper();
try {
File file = new File("/3030.jpg");
FileInputStream fis = new FileInputStream(file);
Blob b = lh.createBlob(fis, fis.available());
resultExtra.setFile(b);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
resultExtraDAO.save(resultExtra);
factory.getResultExtraDAO().commitTransaction();
}
这是正确的方法吗?如果存在,那么存在遗忘的风险 manny simultanious上传和/或大文件?还有其他解决方案会更好吗?
另外,我正在使用'Generic Data Access Object'模式封装hibernate,所以我不喜欢像我这样直接访问HibernateUtil,但到目前为止我还没有想出一个很好的通用方法访问它。欢迎提出建议。
答案 0 :(得分:1)
将文件存储为数据库中的Blob将起作用。但是,当您开始在数据库中获得越来越多的此类文件时,这可能会成为一个问题。根据您期望的文件量,我建议您考虑不要将所述文件存储在数据库中。
或许考虑将它们存储在内容存储库中,例如Jackrabbit。然后可以通过URL访问这些文件,该URL告诉您它们在存储库中的位置。
总而言之,如果你真的想要你的数据库中的文件然后你听到的声音很好你可能只想确保你有Hibernate延迟加载这些blob特别是如果他们可以变得很大。但是,我建议您至少考虑一个内容存储库。