使用Hibernate将文件保存在mysql数据库中

Hol*_*olm 5 java mysql hibernate

我正试图找出使用Hibernate在mysql数据库中保存/检索文件的'正确',故障保护方法.该解决方案必须处理非常大的文件,因此最小化内存占用将非常重要.

到目前为止我的解决方案:

包含java.sql.Blob字段的模型类,使用"@Lob"注释的getter.

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();
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?如果有manny simultanious上传和/或大文件,是否有可能用完memmory?还有其他解决方案会更好吗?

另外,我正在使用' 通用数据访问对象 '模式封装hibernate,所以我不喜欢像我这样直接访问HibernateUtil,但到目前为止我还没有想出一个很好的通用方法来访问它.欢迎提出建议.

bre*_*777 1

将文件作为 Blob 存储在数据库中是可行的。但是,当您开始在数据库中获取越来越多的此类文件时,这可能会成为一个问题。根据您期望的文件量,我建议您考虑根本不在数据库中存储所述文件。

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

总而言之,如果您确实想要数据库中的文件,那么您所拥有的听起来不错,您可能只想确保 Hibernate 延迟加载这些 blob,尤其是当它们变得相当大时。但是,我建议您至少考虑一个内容存储库。