向数据库中存一张图片
情况1:
String sql="INSERT INTO photo(userId,photo) VALUES(?,?)";
String url="jdbc:mysql://localhost:3306/lnu";
String user="root";
String password="yanshujun";
Connection c=null;
try {
  c = DriverManager.getConnection(url,user,password);
  PreparedStatement ps;
  ps = c.prepareStatement(sql);
  ps.setInt(1, photoBean.getUserId());
  ps.setBinaryStream(2, photoBean.getPhoto(), photoBean.getSize());
  i=ps.executeUpdate();
  photoBean.getPhoto().close();
} catch (Exception e) {
e.printStackTrace();
}
成功,没有问题(部分内容没有给出)
情况2:
使用DBCP或c3p0取得连接,执行
Connection c=使用连接池获取的链接;
try {
  c = DriverManager.getConnection(url,user,password);
  PreparedStatement ps;
  ps = c.prepareStatement(sql);
  ps.setInt(1, photoBean.getUserId());
  ps.setBinaryStream(2, photoBean.getPhoto(), photoBean.getSize());
  i=ps.executeUpdate();
  photoBean.getPhoto().close();
} catch (Exception e) {
e.printStackTrace();
}
报异常:
java.lang.AbstractMethodError: org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V
异常说是DelegatingPreparedStatement.setBinaryStream是个抽象的方法。
情况3:
同样通过连接池获取连接,向数据库存其他信息,不包括二进制文件,成功,说明不是连接池的问题。
请问这种情况如何解决?

解决方案 »

  1.   

    DBCP或c3p0有可能没有实现mysql的jdbc驱动里面的相关的存二进制文件比如你的img之类的相关接口,所以是个抽象方法。
    这种通用的连接池,对于某种数据库的特性支持不够,是很正常的。
    比如JBoss的连接池,并没有实现Oracle的二维数组作为输入参数的方法。所以,你可以看看DBCP或c3p0里面有没有具体实现通用的存二进制流的方法。
    如果有,就采用它的方法来实现。
    如果没有,认命把,直接jdbc
    我上次做oracle,从自己的连接池往jboss的连接池搬,就出了这个问题,搞了好几天才发现,原来是jboss没有实现,嬲!楼主好运!。