xo_tobacoo 2009-01-09 10:31
浏览 208
已采纳

BLOB 数据类型 selecte ... for update

在Java中使用for update获取需要更新的BLOB数据类型游标会产生锁,是什么时候释放的呢? 感觉很慢,几分钟不能进行操作,即使数据量很小!

[code="java"]
..........
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.128.35:1521:accebiz1", "sales", "salesw");
if (conn != null) {
System.out.println("数据库连接成功!");
} else {
System.out.println("数据库连接失败!");
}

        PreparedStatement lock = conn.prepareStatement(this.getSql("insertTemplate"));//从自己写的xml文件中取SQL
        log.debug(this.getSql("insertTemplate"));
        lock.setInt(1, Integer.parseInt(templateNo));
        lock.setString(2, url);
        lock.setString(3, model);
        lock.setInt(4, Integer.parseInt(modelXAxis));
        lock.setInt(5, Integer.parseInt(priceXAxis));
        lock.setInt(6, Integer.parseInt(inventoryXAxis));
        lock.setInt(7, Integer.parseInt(descriptionXAxis));
        lock.setInt(8, Integer.parseInt(modelYAxis));
        lock.setInt(9, Integer.parseInt(priceYAxis));
        lock.setInt(10, Integer.parseInt(inventoryYAxis));
        lock.setInt(11, Integer.parseInt(descriptionYAxis));
        lock.setString(12, postDate);
        lock.setInt(13, Integer.parseInt(siteinfoNo));
        lock.executeUpdate();
        lock.close();
        PreparedStatement ps = conn.prepareStatement(this.getSql("lockSQL"));
        ps.setInt(1, Integer.parseInt(templateNo));

        ResultSet dataLock = ps.executeQuery();
        while (dataLock.next()) {

            BLOB modelTemplateBlob = (BLOB) dataLock.getBlob("model_template");
            log.debug("------------------->" + modelTemplateBlob.getBufferSize());
            OutputStream out = modelTemplateBlob.getBinaryOutputStream();
            byte[] blob = modelTemplate.getBytes();
            out.write(blob, 0, blob.length);
            out.close();
            log.debug("------------------->4" + dataLock.getString("description_x_axis"));
            // insertBolb(dataLock, "model_template", modelTemplate.getBytes());
            insertBolb(dataLock, "price_template", priceTemplate.getBytes());
            insertBolb(dataLock, "description_template", inventoryTemplate.getBytes());
            insertBolb(dataLock, "inventory_template", descriptionTemplate.getBytes());
        }

        ps.close();

..............

public void insertBolb(ResultSet data, String columeName, byte[] blob) {
try {
log.debug("------------------->start");
BLOB modelTemplateBlob = (BLOB) data.getBlob(columeName);
OutputStream out = modelTemplateBlob.getBinaryOutputStream();
int size = modelTemplateBlob.getBufferSize();
out.write(blob, 0, blob.length);
out.close();
} catch (IOException ex) {
log.debug(ex.getMessage());
log.debug(ex.getStackTrace());
} catch (SQLException sqle) {
log.debug(sqle.getMessage());
System.err.println(sqle.getMessage());
}
}

[/code]
[b]问题补充:[/b]
嗯!是单行锁定哦!

啊? :cry: 需求文档描述的需求是从客户端取得12个参数,其中4个是blob,然后写入数据库同一张表中...呜呜,怎么用servlet一次从客户端取我都没弄不明白,然后需求人员说用request.getParameter(""),我都没晃明白客户端怎么发送的,能用这个方法取,如果是字符串有一般存clob吧?只好当字符串取了然后转byte[]存。现在存发现被锁住好半天.....需求人员说了算,我提出自己的意见,多说几遍我自己觉得自己在放屁, 明年不打算干这鸟程序员了,干满一年也算对得起这第一份工作了

在现行的情况下,存的时候能够用什么方式优化么?

  • 写回答

4条回答 默认 最新

  • 不良校长 2009-01-10 00:13
    关注

    你这么做是不对的, 你怎么可以建立这么多的BLOB在一个表上。
    通常, DBA都是建议BLOB在一个独立的表上, 而且只能一个BLOB对象。 因为每个BLOB都是一个独立的文件存储, 性能很低下的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝