mysql,sqlserver,oracle三种数据库的大对象存取

转载 2007年10月09日 09:41:00
 mysql 大对象存取:
类型一般应该用mediumblod,
blob只能存2的16次方个byte,
mediumblod是24次方,
一般来说够用了.longblob是32次方有些大.

MYSQL默认配置只能存1M大小的文件,要修改配置,WIN版本的在mysql.ini文件中
修改max_allowed_packet,net_buffer_length等几个参数,或直接SET GLOBAL varName=value.
linux版本可以在启动参数后加-max_allowed_packet=xxM等几个参数.

MYSQL存大对象最好直接就setBinaryStream,又快又方便.
而不要先插入空再造型成BLOB然后再setBlob

例子:
import java.sql.*;
import java.io.*;
public class DBTest {

  
  static String driver = "org.gjt.mm.mysql.Driver";
  static String url = "jdbc:mysql://localhost:3306/test";
  static String user = "root";
  static String passwd = "passwd";
  public static void main(String[] args) throws Exception {
    Connection conn = null;
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(url,user,passwd);
      
      int op = 1;
      //插入
      if (op == 0) {
        PreparedStatement ps = conn.prepareStatement("insert into tb_file values (?,?)");
        ps.setString(1, "aaa.exe");
        InputStream in = new FileInputStream("d:/aaa.exe");
        ps.setBinaryStream(2,in,in.available());
        ps.executeUpdate();
        ps.close();
      }
      else {
        //取出
        PreparedStatement ps = conn.prepareStatement("select * from  tb_file where filename = ?");
        ps.setString(1, "aaa.exe");
        ResultSet rs = ps.executeQuery();
        rs.next();
        InputStream in = rs.getBinaryStream("filecontent");
        System.out.println(in.available());
        FileOutputStream out = new FileOutputStream("d:/bbb.exe");
        byte[] b = new byte[1024];
        int len = 0;
        while ( (len = in.read(b)) != -1) {
          out.write(b, 0, len);
          out.flush();
        }
        out.close();
        in.close();
        rs.close();
        ps.close();
      }
    }
    catch (Exception ex) {
      ex.printStackTrace(System.out);
    }
    finally {
      try {conn.close();}
      catch (Exception ex) { }
    }
  }
}


sqlserver 大对象存取没有什么多说的,只要是image类型就行了,注意这是column类型,有人以为它只能存
图象.image是文件镜象的意思.
import java.sql.*;
import java.io.*;
public class DBTest {


  static String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
  static String url = "jdbc:microsoft:sqlserver://192.168.0.202:9999999999;DatabaseName=dddd";
  static String user = "sa";
  static String passwd = "ps";
  public static void main(String[] args) throws Exception {
    Connection conn = null;
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(url,user,passwd);
      int op = 0;
      //插入
      if (op == 0) {
        PreparedStatement ps = conn.prepareStatement("insert into tb_file values (?,?)");
        ps.setString(1, "aaa.exe");
        InputStream in = new FileInputStream("d:/aaa.exe");
        ps.setBinaryStream(2,in,in.available());
        ps.executeUpdate();
        ps.close();
      }
      else {
        //取出
        PreparedStatement ps = conn.prepareStatement("select * from  tb_file where filename = ?");
        ps.setString(1, "aaa.exe");
        ResultSet rs = ps.executeQuery();
        rs.next();
        InputStream in = rs.getBinaryStream("filecontent");
        System.out.println(in.available());
        FileOutputStream out = new FileOutputStream("d:/bbb.exe");
        byte[] b = new byte[1024];
        int len = 0;
        while ( (len = in.read(b)) != -1) {
          out.write(b, 0, len);
          out.flush();
        }
        out.close();
        in.close();
        rs.close();
        ps.close();
      }
    }
    catch (Exception ex) {
      ex.printStackTrace(System.out);
    }
    finally {
      try {conn.close();}
      catch (Exception ex) { }
    }
  }
}



ORACLE的大对象存储有些变态,要无论是Blob,还是CLOB都要求先插入一个空值,然后
查询并锁定这一条记录,获取对Lob的引用再进行填充,网上有太多的例子.我个人认为
这种方法垃圾得连写都不想写了,你可以自己去搜索一下.
这种特别的操作既增加操作的复杂度,又违反了JDBC接口的规范,所以我极力反对这样
使用,如果你和我有同样的观点.那么我提供另一种通用的方法.就是你不用LOB而用
oracle的LONG RAW来代替它们.这样就可以象其它对象一样操作了:

create table tb_file(filename varchar2(255),filecontent LONG RAW);


import java.sql.*;
import java.io.*;

public class BlobTest {

  static String driver = "oracle.jdbc.driver.OracleDriver";
  static String url = "jdbc:oracle:thin:@localhost:1521:test";
  static String user = "system";
  static String passwd = "passwd";
  public static void main(String[] args) throws Exception {
    Connection conn = null;
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(url, user, passwd);
      int op = 1;
      //插入
      if (op == 0) {
        PreparedStatement ps = conn.prepareStatement("insert into tb_file values (?,?)");
        ps.setString(1, "aaa.exe");
        InputStream in = new FileInputStream("d:/aaa.exe");
        ps.setBinaryStream(2,in,in.available());
        ps.executeUpdate();
        ps.close();
      }
      else {
        //取出
        PreparedStatement ps = conn.prepareStatement("select * from  tb_file where filename = ?");
        ps.setString(1, "aaa.exe");
        ResultSet rs = ps.executeQuery();
        rs.next();
        InputStream in = rs.getBinaryStream("filecontent");
        System.out.println(in.available());
        FileOutputStream out = new FileOutputStream("d:/bbb.exe");
        byte[] b = new byte[1024];
        int len = 0;
        while ( (len = in.read(b)) != -1) {
          out.write(b, 0, len);
          out.flush();
        }
        out.close();
        in.close();
        rs.close();
        ps.close();
      }
    }
    catch (Exception ex) {
      ex.printStackTrace(System.out);
    }
    finally {
      try {
        conn.close();
      }
      catch (Exception ex) {}
    }
  }
}

sqlserver、Mysql、Oracle三种数据库的优缺点总结

一、sqlserver 优点: 易用性、适合分布式组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等; 为数据管理与分析带来了灵活性,允许单位在快速变化的...
  • QQ519423035
  • QQ519423035
  • 2017年05月11日 11:28
  • 1009

对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析   Oracle Database Oracle Database,又名Oracle RDBMS,或简称...
  • ranran_5300
  • ranran_5300
  • 2015年08月31日 09:01
  • 7109

mysql,sqlserver,oracle三种数据库的大对象存取

mysql 大对象存取: 类型一般应该用mediumblod, blob只能存2的16次方个byte, mediumblod是24次方, 一般来说够用了.longblob是32次方有些大. ...
  • panaceasHan
  • panaceasHan
  • 2014年10月19日 14:34
  • 127

MySql Oracle SqlServer三大数据库的数据类型列表

http://blog.csdn.net/zztfj/article/details/6064193 MySql数据类型   数据类型 描述 字节 推荐使用 SMALLI...
  • bytxl
  • bytxl
  • 2014年02月15日 14:23
  • 1090

oracle数据库中的大对象

整理自丁俊老师plsql文档: 1、基本介绍 oracle和pl/sql都支持lob(large object)类型,用来存储大数量数据,如图像文件,声音文件等。oracle 10g r1...
  • lively1982
  • lively1982
  • 2013年12月12日 14:29
  • 2135

sqlserver、Mysql、Oracle三种数据库的优缺点总结

一、sqlserver优点: 易用性、适合分布式组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等; 为数据管理与分析带来了灵活性,允许单位在快速变化...
  • silentwolfyh
  • silentwolfyh
  • 2016年04月01日 11:08
  • 1587

数据库笔记——Mysql、Oracle、Sqlserver || Redis、Memcached、mongoDB环境搭建

个人数据库基础笔记,将各类数据库从环境搭建到使用简单回忆整理,方便自己回顾知识点,也同大家分享下: 关系型数据库(一般基于Jdbc和Sql语法):Mysql   、Oracle 、SqlServe...
  • Zyp689
  • Zyp689
  • 2017年06月21日 19:32
  • 414

oracle、SqlServer、mysql字段类型比较

最近在进行数据抽取的时候,设计到多个数据库,oracle、SqlServer、mysql。这个时候字段类型映射成了一个比较头疼的问题,所以想整理一下这三个常用数据库之间的字段类型比较。 1、常见类型...
  • a275838263
  • a275838263
  • 2016年04月05日 09:57
  • 2400

oracle,mysql,SqlServer三种数据库的分页查询的实例

oracle,mysql,SqlServer三种数据库的分页查询的实例,需要的朋友可以参考一下 MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数。一般只需要直接写到sql语句...
  • qq_37878579
  • qq_37878579
  • 2018年01月01日 23:46
  • 45

oracle,mysql,SqlServer三种数据库的分页查询总结

MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数。一般只需要直接写到sql语句后面就行了。 LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参...
  • SH_King
  • SH_King
  • 2015年07月31日 15:36
  • 1821
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql,sqlserver,oracle三种数据库的大对象存取
举报原因:
原因补充:

(最多只允许输入30个字)