gpt4 book ai didi

java - 通过 JDBC 读取 `BLOB` 花费的时间太长

转载 作者:行者123 更新时间:2023-11-29 06:17:00 25 4
gpt4 key购买 nike

当我从数据库中读取图像时,它立即出现在 JLabel 中,但是完成从数据库中流式传输 BLOB 需要花费太多时间。

public byte[] selectImage(int Id) throws SQLException {
ResultSet res=null;
int c=0;

try {
Class.forName(driver);
con = DriverManager.getConnection(connectionURL);
} catch (SQLException ex) {
Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
}

System.out.println(con.getAutoCommit());

statement = con.createStatement() ;
res = statement.executeQuery("SELECT PHOTO FROM CUSTOMER where ID="+Id) ;

while(res.next() && (res!=null)) {
Blob bodyOut = res.getBlob("PHOTO");
int length = (int) bodyOut.length();
System.out.println(" Body Size = "+length);
imageBytes = bodyOut.getBytes(1, length);
bodyOut.free();
}

return imageBytes;
}

最佳答案

考虑将图像存储在数据库之外。只在数据库中存储足够的信息让你找到文件(在文件系统上,或者从 HTTP 服务器,或者你现在存储它,因为它不在数据库中)。二进制数据并不是 RDBMS 优化处理的真正用例。

另外,你的代码有一些严重的问题:

  1. 最大的问题可能是由于未能使用绑定(bind)变量而导致的安全漏洞,也就是 PreparedStatement在 java 。这是 SQL 注入(inject) 101。

  2. 您正在使用原始 JDBC。原始 JDBC 乏味且容易搞砸。例如,您没有关闭 ResultSetConnection,更不用说 statement 变量了,它绝对应该是本地的。当您开始关闭它们时,您应该在 finally block 中执行此操作,以确保它始终发生,即使出现错误也是如此。

  3. 如果您碰巧从查询中获得了多个结果——我猜您不应该,但为了以防万一——您只会知道是否碰巧查看了STDOUT,你只会得到最后一张图片。您的 while 循环可能更好地表示为 if 以指示您只期望和/或关心第一个结果。如果您关心是否有多个结果,您可能应该使用 if 而不是 while,然后添加后续 if (rs.next()) throw new MyAppropriatelyNamedException; 这样你就知道发生了意想不到的事情。

  4. null 检查 res 毫无值(value)。当您执行检查时,rs.next() 语句将已经抛出一个 NullPointerException。您可能应该只删除支票。

  5. 为什么用日志框架,转身用System.out.println输出一些调试信息?

关于java - 通过 JDBC 读取 `BLOB` 花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4735846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com