使用Hibernate将文件保存到MySQL数据库

5
我正在尝试找到使用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();
}

这是正确的方法吗?如果有许多同时上传和/或大文件,是否存在内存耗尽的风险?是否有更好的解决方案?

另外,我正在使用“通用数据访问对象”模式封装Hibernate,因此我不喜欢直接访问HibernateUtil,但到目前为止,我还没有想出一个很好的通用访问方式。欢迎提供建议。

1个回答

1

将文件作为 Blob 存储在您的数据库中是可行的。然而,随着您在数据库中存储越来越多此类文件,这可能会成为一个问题。根据您预期的文件数量,我建议您考虑根本不要将这些文件存储在数据库中。

也许考虑将它们存储在内容库中,例如 Jackrabbit。然后,可以通过 URL 访问这些文件,该 URL 告诉您它们在存储库中的位置。

因此,总结一下,如果您真的想要将文件存储在数据库中,那么您现在的做法听起来不错,但是如果这些文件很大,您可能需要确保 Hibernate 惰性加载这些 Blob。然而,我建议您至少考虑使用内容库。


@brent777 感谢您的建议,我会看看Jackrabbit。如果接下来几天没有更多的答案,我会将您的回答标记为已接受。 - Holm
此外,使用内容存储库而不是直接将文件存储在本地文件系统中的最大优势是什么? - Holm
有相当多的优势,由于我现在有些懒惰,我将留下以下来自Jackrabbit Wiki的优势清单 :) - brent777
数据存储与 Blob 存储相比的主要优势是:与 Blob 存储不同,数据存储每个对象只保留一份副本,即使该对象被多次使用。数据存储会检测是否已经存储了相同的对象,并且只会存储到现有对象的链接。数据存储可以跨多个工作区共享,甚至可以跨多个仓库共享(如果需要)。数据存储操作(读取和写入)不会阻塞其他用户,因为它们是在持久性管理器之外完成的。可以同时进行多个数据存储操作。 - brent777
我希望这回答了你的问题 @Holm。 - brent777

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接