数据库大数据的处理

 

 

首先声明:数据库的大数据处理一般不在实际操作中应用,这是为了避免数据库被占用,而导致资源不能被访问,还有内存分配等方面出现。

基本概念:大数据也称之为LOB(Large Objects)LOB又分为:clobblob

clob用于存储大文本。Text

blob用于存储二进制数据,例如图像、声音、二进制文等。

MySQL而言只有blob,而没有clobmysql存储大文本采用的是TextTextblob分别又分为:

TINYTEXTTEXTMEDIUMTEXTLONGTEXT

TINYBLOBBLOBMEDIUMBLOBLONGBLOB 

对于MySQL中的Text类型下方法设置:,可调用如:

PreparedStatement.setCharacterStream(index, reader, length);

//注意length长度须设置,并且设置为int

MySQL中的Text类型,可调用如下方法获取:

reader = resultSet. getCharacterStream(i);

reader = resultSet.getClob(i).getCharacterStream();

string s = resultSet.getString(i);

对于MySQL中的BLOB类型,可调用如下方法设置:

PreparedStatement. setBinaryStream(i, inputStream, length);

MySQL中的BLOB类型,可调用如下方法获取:

InputStream in  = resultSet.getBinaryStream(i);

InputStream in  = resultSet.getBlob(i).getBinaryStream(); 

案例1,向数据库的表中插入或读取大文本数据。

准备:

l com.hbsi.utils包下的DBManager类负责获得连接以及资源的释放。

l 属性文件db.properties保存了建立连接时需要的参数。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/demodb
username=root
password=root

l MySQL的驱动

l src目录下放置一个文本文件1.txt

l 创建数据库、表
create database demodb;
use demodb;
create table testclob
(
   id int primary key auto_increment,
   resume text
);

编写代码:Demo1.java

public void insert(){

Connection conn = null;

PreparedStatement st = null;

ResultSet rs = null;

try{

conn = DBManager.getConnection();

String sql = "insert into testclob(resume) values(?)";

st = conn.prepareStatement(sql);

//st.setCharacterStream()方法的第二个参数需要一个流对象,第三个但是需要大文本文件的长度,因此通过Demo1.class调用getcLassLoader()方法得到类加载器后没有直接得到输入流对象,而是先得到相关文件的路径和文件名,再构建一个File对象,利用该File对象得到相关文件的长度

//该方法自动从流中读取数据存入表格中

String path = Demo1.class.getClassLoader().getResource("1.txt").getPath();

File f = new File(path);

st.setCharacterStream(1, new FileReader(path),(int)f.length() );

//setCharacterStream()方法在jdk1.6之前的版本第三个参数只能是int类型,jdk1.6之后可以是long类型(重载方法)

int num = st.executeUpdate();

if(num>0){

System.out.println("插入成功!!");

}

}catch (Exception e) {

throw new RuntimeException(e);

}finally{

DBManager.release(conn, st, rs);

}

}

public void find(){

Connection conn = null;

PreparedStatement st = null;

ResultSet rs = null;

try{

conn = DBManager.getConnection();

String sql = "select resume from testclob where id=1";

st = conn.prepareStatement(sql);

rs = st.executeQuery();

if(rs.next()){

Reader reader = rs.getCharacterStream("resume");

char buffer[] = new char[1024];//缓冲区不能太大,大文本一点一点地流进来

int len = 0;

FileWriter writer = new FileWriter("c:\\1.txt");

while((len=reader.read(buffer))>0){

writer.write(buffer,0,len);

}

reader.close();

writer.close();

}

}catch (Exception e) {

throw new RuntimeException(e);

}finally{

DBManager.release(conn, st, rs);

}

}

代码段如果写成这样:

if(rs.next()){

String result=rs.getString(“resume”);

System.out.println(result);

}

也能执行,可在控制台窗口看到大文本的输出。可是在实际的操作中千万不要这样写!因为这样做是将数据库中的大文本读到内存的字符串中,如果该大文本是非常大的,500M1G,系统就立刻在内存中开辟500M1G的内存,系统立即就崩溃了,死机。这时一定要用流,一点一点地将数据库的大文本内容流进来。

3、大二进制数据

案例2,向数据库的表中插入或获取大二进制数据。

准备:

l com.hbsi.utils包下的DBManager类负责获得连接以及资源的释放。

l 属性文件db.properties保存了建立连接时需要的参数。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/demodb
username=root
password=root

l MySQL的驱动

l src目录下一个图片文件1.jpg

l 创建表
create table testblob
(
   id int primary key auto_increment,
   images blob
);

编写代码:Demo2.java

public void insert(){

Connection conn = null;

PreparedStatement st = null;

ResultSet rs = null;

try{

conn = DBManager.getConnection();

String sql = "insert into testblob(images) values(?)";

st = conn.prepareStatement(sql);

String path = Demo1.class.getClassLoader().getResource("1.jpg").getPath();

File f = new File(path);

st.setBinaryStream(1, new FileInputStream(path), (int) f.length());

int num = st.executeUpdate();

if(num>0){

System.out.println("插入成功!!");

}

}catch (Exception e) {

throw new RuntimeException(e);

}finally{

DBManager.release(conn, st, rs);

}

}

代码运行后,在mysql中输入select * from testblob;语句查看图片,看不了,这时即使能看也是乱码,而且停不了,很难退出来。可以用mysql的工具软件来查看。或是通过如下的代码查看:

public void find(){

Connection conn = null;

PreparedStatement st = null;

ResultSet rs = null;

try{

conn = DBManager.getConnection();

String sql = "select images from testblob where id=1";

st = conn.prepareStatement(sql);

rs = st.executeQuery();

if(rs.next()){

InputStream in = rs.getBinaryStream("images");

byte buffer[] = new byte[1024];

int len = 0;

FileOutputStream out = new FileOutputStream("c:\\1.jpg");

while((len=in.read(buffer))>0){

out.write(buffer, 0, len);

}

in.close();

out.close();

}

}catch (Exception e) {

throw new RuntimeException(e);

}finally{

DBManager.release(conn, st, rs);

}

}

展开阅读全文

没有更多推荐了,返回首页