前台页面图片无法显示

前台页面图片无法显示

通过使用mybatis的xml配置文件来进行数据库查询

xml中的图片查询语句:

<select id="selectPaintingImg" resultType="com.imooc.gallery.entity.Oil_painting">
    select `smallImg` from `oil-painting` where id = #{id}
</select>

DAO中获取图片的方法:

public static Oil_painting getPaintingImg(Long id) {
    Oil_painting painting = null;
    try {
        sqlSession = MybatisUtils.getSqlSession();
        painting = sqlSession.selectOne("selectPaintingImg",new Oil_painting(id));
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        sqlSession.close();
    }
    return painting;
}

service中代码:

if ("/getImg.jpg".equals(request.getServletPath())){
    //获取油画的图片id
    String idStr = request.getParameter("id");
    //获得指定id的油画信息
    Oil_painting painting = HomeService.getPaintingImg(Long.valueOf(idStr));

    InputStream input = null;
    ServletOutputStream out = null;
    try {
        response.setContentType("multipart/form-data");
        if (null != painting && null != painting.getSmallImg()){
            System.out.println(painting.getSmallImg().length);
            input = new ByteArrayInputStream(painting.getSmallImg());
            out = response.getOutputStream();
            byte[] b = new byte[1024];
            int length = input.read(b);
            while(length != -1){
                out.write(b);
                length = input.read(b);
            }
            out.flush();
            response.flushBuffer();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        out.close();
        input.close();
    }
}

某些时候可以加载所有图片:

http://img1.sycdn.imooc.com//climg/5b31e54e0001cb0512180525.jpg

当刷新页面后有些图片就无法显示:

http://img1.sycdn.imooc.com//climg/5b31e58200019c6812510477.jpg

根据调试的结果显示是没有从数据库中获得相应id的油画对象而抛出的空指针异常。对DAO层的查询方法调试的时候当执行查询语句时抛出异常:Executor was closed

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in mapper/PaintingMapper.xml
### The error may involve com.imooc.gallery.entity.Oil_painting.selectPaintingImg
### The error occurred while executing a query
### Cause: java.lang.NullPointerException


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
一叶知秋519 2018-06-26 16:01:13

此处建议同学将图片路径存储到数据库,将图片存储到本地;

出现类似的问题应该是读取数据库中的图片耗时偏长导致的。

建议同学根据这种方法尝试一下~

祝学习愉快!

  • 提问者 Special994 #1
    问题已经解决了,出现问题的地方在获取图片的方法中使用了全局变量sqlSession来进行数据库查询。我的猜想是:由于查询的图片较多,当第一次查询时,第二次查询会重新open一个sqlSession,当第一次查询完成后会将sqlSession关闭,由于使用的是全局变量sqlSession,执行clse()后会关闭掉这个sqlSession对象,进而影响了第二次查询。 解决方法:在获得图片的方法中使用局部变量SqlSession sqlSession1 = MybatisUtils.getSqlSession();每次调用方法都会重新创建一个sqlSession对象,不同对象之间互不影响。
    2018-06-26 18:32:25
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师