【发布时间】:2010-05-02 12:03:04
【问题描述】:
我正在开发一个基于 Spring+Hibernate+MySQL 的 Web 项目。我被困在必须将用户上传的图像存储到数据库中的地步。虽然我已经编写了一些目前运行良好的代码,但我相信项目上线时事情会一团糟。
这是我携带图像字节的域类:
@Entity
public class Picture implements java.io.Serializable{
long id;
byte[] data;
... // getters and setters
}
这是我在提交时保存文件的控制器:
public class PictureUploadFormController extends AbstractBaseFormController{
...
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception{
MutlipartFile file;
// getting MultipartFile from the command object
...
// beginning hibernate transaction
...
Picture p=new Picture();
p.setData(file.getBytes());
pictureDAO.makePersistent(p); // this method simply calls getSession().saveOrUpdate(p)
// committing hiernate transaction
...
}
...
}
显然是一段糟糕的代码。无论如何我可以使用 InputStream 或 Blob 来保存数据,而不是先将所有字节从用户加载到内存中,然后再将它们推送到数据库中?
我对 hibernate 对 Blob 的支持做了一些研究,并在 Hibernate In Action 书中找到了这一点:
java.sql.Blob 和 java.sql.Clob 是 处理大数据的最有效方法 Java 中的对象。不幸的是,一个 Blob 或 Clob 的实例仅 在 JDBC 事务之前可用 完成。 所以如果你的持久类 定义 java.sql.Clob 的属性或 java.sql.Blob(不是一个好主意 无论如何),您将受到限制 可以使用该类的实例。 在 特别是,您将无法使用 该类的实例为分离的 对象。此外,许多 JDBC 驱动程序没有工作支持 对于 java.sql.Blob 和 java.sql.Clob。 因此,映射更有意义 使用二进制或文本的大型对象 映射类型,假设检索 将整个大对象放入内存 不是性能杀手。
请注意 可以找到最新的设计模式 和大对象使用技巧 Hibernate 网站,有技巧 特定平台。
现在显然无法使用 Blob,因为它无论如何都不是一个好主意,还有什么可以用来提高性能的?我在 Hibernate 网站上找不到任何最新的设计模式或任何有用的信息。因此,我们将不胜感激来自 stackoverflowers 的任何帮助/建议。
谢谢
【问题讨论】:
标签: java mysql hibernate spring blob