mysql大对象存取: 类型一般应该用mediumblod, blob只能存2的16次方个byte, mediumblod是24次方, 一般来说够用了.longblob是32次方有些大.
MYSQL默认配置只能存1M大小的文件,要修改配置,WIN版本的在mysql.ini文件中 修改max_allowed_packet,net_buffer_length等几个参数,或直接SETGLOBALvarName=value. linux版本可以在启动参数后加-max_allowed_packet=xxM等几个参数.
MYSQL存大对象最好直接就setBinaryStream,又快又方便. 而不要先插入空再造型成BLOB然后再setBlob
例子: importjava.sql.*; importjava.io.*; publicclassDBTest{
staticStringdriver="org.gjt.mm.mysql.Driver"; staticStringurl="jdbc:mysql://localhost:3306/test"; staticStringuser="root"; staticStringpasswd="passwd"; publicstaticvoidmain(String[]args)throwsException{ Connectionconn=null; try{ Class.forName(driver); conn=DriverManager.getConnection(url,user,passwd);
intop=1; //插入 if(op==0){ PreparedStatementps=conn.prepareStatement("insertintotb_filevalues(?,?)"); ps.setString(1,"aaa.exe"); InputStreamin=newFileInputStream("d:/aaa.exe"); ps.setBinaryStream(2,in,in.available()); ps.executeUpdate(); ps.close(); } else{ //取出 PreparedStatementps=conn.prepareStatement("select*fromtb_filewherefilename=?"); ps.setString(1,"aaa.exe"); ResultSetrs=ps.executeQuery(); rs.next(); InputStreamin=rs.getBinaryStream("filecontent"); System.out.println(in.available()); FileOutputStreamout=newFileOutputStream("d:/bbb.exe"); byte[]b=newbyte[1024]; intlen=0; while((len=in.read(b))!=-1){ out.write(b,0,len); out.flush(); } out.close(); in.close(); rs.close(); ps.close(); } } catch(Exceptionex){ ex.printStackTrace(System.out); } finally{ try{conn.close();} catch(Exceptionex){} } } }
sqlserver大对象存取没有什么多说的,只要是image类型就行了,注意这是column类型,有人以为它只能存 图象.image是文件镜象的意思. importjava.sql.*; importjava.io.*; publicclassDBTest{
staticStringdriver="com.microsoft.jdbc.sqlserver.SQLServerDriver"; staticStringurl="jdbc:microsoft:sqlserver://192.168.0.202:9999999999;DatabaseName=dddd"; staticStringuser="sa"; staticStringpasswd="ps"; publicstaticvoidmain(String[]args)throwsException{ Connectionconn=null; try{ Class.forName(driver); conn=DriverManager.getConnection(url,user,passwd); intop=0; //插入 if(op==0){ PreparedStatementps=conn.prepareStatement("insertintotb_filevalues(?,?)"); ps.setString(1,"aaa.exe"); InputStreamin=newFileInputStream("d:/aaa.exe"); ps.setBinaryStream(2,in,in.available()); ps.executeUpdate(); ps.close(); } else{ //取出 PreparedStatementps=conn.prepareStatement("select*fromtb_filewherefilename=?"); ps.setString(1,"aaa.exe"); ResultSetrs=ps.executeQuery(); rs.next(); InputStreamin=rs.getBinaryStream("filecontent"); System.out.println(in.available()); FileOutputStreamout=newFileOutputStream("d:/bbb.exe"); byte[]b=newbyte[1024]; intlen=0; while((len=in.read(b))!=-1){ out.write(b,0,len); out.flush(); } out.close(); in.close(); rs.close(); ps.close(); } } catch(Exceptionex){ ex.printStackTrace(System.out); } finally{ try{conn.close();} catch(Exceptionex){} } } }
ORACLE的大对象存储有些变态,要无论是Blob,还是CLOB都要求先插入一个空值,然后 查询并锁定这一条记录,获取对Lob的引用再进行填充,网上有太多的例子.我个人认为 这种方法垃圾得连写都不想写了,你可以自己去搜索一下. 这种特别的操作既增加操作的复杂度,又违反了JDBC接口的规范,所以我极力反对这样 使用,如果你和我有同样的观点.那么我提供另一种通用的方法.就是你不用LOB而用 oracle的LONGRAW来代替它们.这样就可以象其它对象一样操作了:
createtabletb_file(filenamevarchar2(255),filecontentLONGRAW);
importjava.sql.*; importjava.io.*;
publicclassBlobTest{
staticStringdriver="oracle.jdbc.driver.OracleDriver"; staticStringurl="jdbc:oracle:thin:@localhost:1521:test"; staticStringuser="system"; staticStringpasswd="passwd"; publicstaticvoidmain(String[]args)throwsException{ Connectionconn=null; try{ Class.forName(driver); conn=DriverManager.getConnection(url,user,passwd); intop=1; //插入 if(op==0){ PreparedStatementps=conn.prepareStatement("insertintotb_filevalues(?,?)"); ps.setString(1,"aaa.exe"); InputStreamin=newFileInputStream("d:/aaa.exe"); ps.setBinaryStream(2,in,in.available()); ps.executeUpdate(); ps.close(); } else{ //取出 PreparedStatementps=conn.prepareStatement("select*fromtb_filewherefilename=?"); ps.setString(1,"aaa.exe"); ResultSetrs=ps.executeQuery(); rs.next(); InputStreamin=rs.getBinaryStream("filecontent"); System.out.println(in.available()); FileOutputStreamout=newFileOutputStream("d:/bbb.exe"); byte[]b=newbyte[1024]; intlen=0; while((len=in.read(b))!=-1){ out.write(b,0,len); out.flush(); } out.close(); in.close(); rs.close(); ps.close(); } } catch(Exceptionex){ ex.printStackTrace(System.out); } finally{ try{ conn.close(); } catch(Exceptionex){} } } } |
|
相关推荐
mysql,sqlserver,oracle三种数据库的大对象存取解析.docx
图片存取功能(支持mysql,oracle,sqlserver)完整的demo例子,可运行。mysql(longblob、blob),oracle(BLOB),SQLSERVER(varbinary(MAX))
sqlite数据库存取中文乱码的全部解决方案(包括其它数据库oracle+sqlserver+mysql) 数据库的连接方式、数据库里存放数据的字体编码、所选编程语言的缺省字体编码。如果在编程中遇到不能正确显示中文时、、、、
dataserver Redis队列入库工具是把redis队列内存中的json字符串自动保存到数据库的工具,它支持Oracle,sqlserver和mysql等主流数据库
下边是部分目录,觉得有用的话就顶一个 C:. │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整tempdb数据库的文件...
Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ... 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。 Python的D
Cache Server提供了和传统关系数据库管理系统(MS SQL SERVER、Oracle、Sybase、DB2、mysql)的访问接口,可以以同步或异步方式和RDBMS交互。 Cache Server内存数据库为需要容错服务的系统提供实时数据库复制功能...
2)可以对所以主流数据库进行统一访问(access,MySQL,sql server,Oracle)。 3)极大地减少了程序操作数据库的复杂性。 4)jdbc使用面向对象的方式操作数据,能更好的和Java语言衔接。 5)jdbc可以直接...
支持多重数据库管理工具,支持市面上的大多数数据库系统:例如 Microsoft Access、Generic ODBC、SQL Server、LocalDB、SQL Server Compact、SQL Azure、MySQL、Oracle、Sybase ASE 等等。 Database .NET 中文版 也...
database4是一个免费多重数据库...Database .NET支持的的数据库有:MS Access、excel、dBase、forpro、firebird、Mysql、sql server、sqlite、oracle、odbc、ibm db2、sybase ase等等,能够对它们进行连接编辑修改。
除unidac外我愛用的一套,可存取不同数据库,可完全取代掉BDE,特别是异构数据库的联接,相当方便。 SQLDirect Component Library is a light-weight Borland Database Engine replacement for Borland/CodeGear/...
什么是关系型数据库? 关系型数据库,是指采用了关系模型来组织数据的数据库,...MySQL 是一个关系型数据库管理系统,MySQL 是最流行的关系型数据库管理系统之一,常见的关系型数据库还有 Oracle 、SQL Server、Access
Cache Server提供了和传统关系数据库管理系统(MS SQL SERVER、Oracle、Sybase、DB2、mysql)的访问接口,可以以同步或异步方式和RDBMS交互。 Cache Server内存数据库为需要容错服务的系统提供实时数据库复制功能...
常见的DBMS包括access、sqlserver、mysql、oracle、DB2等 图书管理员 图书馆 用户 请求 DBMS Database 程序 数据库 用户请求 关系型数据库系统特点 数据结构化和共享性 库、表、字段 结构化查询语言(SQL) 数据独立...
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少. # 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80% # 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸....