诗剑书生的专栏

我在灌江口上住,花开花落,不知流年度.雁过空遗秋色暮,抚琴细听梧桐雨. 轻舞残虹漫展书,云卷云舒,思愫万千缕.安得婵娟与共处,长作识字耕田夫.                   诗剑书生 于灌江口.听潮居

诗剑书生ID:axman
104825次访问,排名829好友0人,关注者7
一个男人. 一个写程序男人. 一个写程序并从程序中寻找快乐的男人. 一个写程序并从程序中寻找快乐又把快乐传递给大家的男人.
一个书生. 一个寂寞的书生. 一个寂寞的梅香竹影下敲声写韵的书生. 一个寂寞的梅香竹影下敲声写韵晨钟暮鼓中逸气扬剑的书生.
那个男人是位书生。没有人知道他的姓名,居无定所,行无定踪,亦耕亦读,或渔或樵。
axman的文章
原创 87 篇
翻译 0 篇
转载 0 篇
评论 162 篇
axman的公告
最近评论
axman:不用说明什么,一切都如我预料的那样.
在整个奥运开幕式期间,我一边看电视,一边访问
http://www.cctvolympics.com/main.php?type=vod这个地址,其间访问一百多次,没有一次成功.大多数时候是前端缓存的squid在报refuse(111).有时以过几分钟的等待,能出来页面,但Flash缓冲的进度条到了99%就一直停止在那儿.
……
myvicc:写得不错,等写下文
chinagavin:我是先读三位正向输出,然后再读三位反向输出来最终达到想要的结果。
chinagavin:更新啊,好久没更新了。
YuLimin:快更新呀。。。等着呢:)呵呵。。。
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 mysql,sqlserver,oracle三种数据库的大对象存取收藏

    新一篇: Best scheme of oracle multiPage  | 旧一篇: 为什么要始终使用PreparedStatement代替Statement?

    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) {}
        }
      }
    }

     

    发表于 @ 2006年07月07日 08:41:00|评论(loading...)|编辑

    新一篇: Best scheme of oracle multiPage  | 旧一篇: 为什么要始终使用PreparedStatement代替Statement?

    评论

    #张孝祥 发表于2006-09-15 16:58:00  IP: 162.105.81.*
    第一次看你的blog,不错,真有几把刷子啊!!!你干什么工作的啊,什么都玩?这篇文章我借用了,这是我在网上看到的讲解类似技术讲解得最好的文章,正好给学员们讲讲,谢了!
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © axman