[转载]MYSQ数据库CLOB、BLOB存取

本文深入探讨了数据库中文本和二进制大字段类型的使用方法,包括如何通过Java进行CRUD操作,以及如何实现数据的读写和存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自 http://xdnh.iteye.com/blog/939858

文本大字段类型(CLOB)

------------------------------------------------------------------------------------------------------------------------

>>>>>>>>>> 数据库脚本 <<<<<<<<<<

CREATE TABLE `clob_test` (
`id`  integer NOT NULL AUTO_INCREMENT ,
`txt`  text NOT NULL ,
PRIMARY KEY (`id`)
)
;

>>>>>>>>>> ClobTest.java <<<<<<<<<<

package com.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ClobTest {

	public static void main(String[] args) throws SQLException, IOException {
		read();

		System.out.println("--- End ---");
	}

	// 增加
	static void create() throws SQLException, IOException {

		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = "insert into clob_test (txt) values (?)";

		try {
			conn = JdbcUtils.getConnection();
			pstmt = conn.prepareStatement(sql);

			File file = new File("src/com/test/JdbcUtils.java");
			Reader reader = new BufferedReader(new FileReader(file));

			pstmt.setCharacterStream(1, reader, file.length());
			pstmt.executeUpdate();

			reader.close();
		} finally {
			JdbcUtils.free(null, pstmt, conn);
		}
	}

	// 查询
	static void read() throws SQLException, IOException {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String sql = "select txt from clob_test";
		try {
			conn = JdbcUtils.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			while (rs.next()) {
				Clob clob = rs.getClob(1);

				Reader reader = clob.getCharacterStream();

				File file = new File("JdbcUtils.java");
				Writer writer = new BufferedWriter(new FileWriter(file));

				char[] buff = new char[1024];

				for (int i = 0; (i = reader.read(buff)) > 0;) {
					writer.write(buff, 0, i);
				}

				writer.flush();
				writer.close();
				reader.close();

			}
		} finally {
			JdbcUtils.free(rs, stmt, conn);
		}
	}

}

二进制大字段类型(BLOB)

------------------------------------------------------------------------------------------------------------------------

 

>>>>>>>>>> 数据库脚本 <<<<<<<<<<

CREATE TABLE `blob_test` (
`id`  integer NOT NULL AUTO_INCREMENT ,
`pic`  blob NOT NULL ,
PRIMARY KEY (`id`)
)
;

package com.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class BlobTest {

	public static void main(String[] args) throws SQLException, IOException {
		read();

		System.out.println("--- End ---");
	}

	// 增加
	static void create() throws SQLException, IOException {

		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = "insert into blob_test (pic) values (?)";

		try {
			conn = JdbcUtils.getConnection();
			pstmt = conn.prepareStatement(sql);

			File file = new File("level.gif");
			InputStream is = new BufferedInputStream(new FileInputStream(file));

			pstmt.setBinaryStream(1, is, file.length());
			pstmt.executeUpdate();

			is.close();
		} finally {
			JdbcUtils.free(null, pstmt, conn);
		}
	}

	// 查询
	static void read() throws SQLException, IOException {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String sql = "select pic from blob_test";
		try {
			conn = JdbcUtils.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			while (rs.next()) {
				Blob blob = rs.getBlob(1);

				InputStream is = blob.getBinaryStream();

				File file = new File("logo.gif");
				OutputStream os = new BufferedOutputStream(
						new FileOutputStream(file));

				byte[] buff = new byte[1024];

				for (int i = 0; (i = is.read(buff)) > 0;) {
					os.write(buff, 0, i);
				}

				os.flush();
				os.close();
				is.close();

			}
		} finally {
			JdbcUtils.free(rs, stmt, conn);
		}
	}

}

数据库工具类:

------------------------------------------------------------------------------------------------------------------------

 

>>>>>>>>>> JdbcUtils.java <<<<<<<<<<

package com.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 数据库工具类
 * 
 * @author MY
 * @version 1.0, 2011-03-03
 * 
 */
public final class JdbcUtils {

	private static String url = "jdbc:mysql:///jdbc";
	private static String username = "root";
	private static String password = "";

	private JdbcUtils() {

	}

	static {
		try {
			// 1、注册驱动
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	/**
	 * 得到数据库连接
	 * 
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, username, password);
	}

	/**
	 * 关闭数据库资源
	 * 
	 * @param rs
	 * @param stmt
	 * @param conn
	 */
	public static void free(ResultSet rs, Statement stmt, Connection conn) {
		try {
			if (rs != null) {
				rs.close();
				rs = null;
			}
		} catch (SQLException e) {
			System.out.println("ResultSet关闭失败:" + e.getMessage());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
					stmt = null;
				}
			} catch (SQLException e) {
				System.out.println("Statement关闭失败:" + e.getMessage());
			} finally {
				try {
					if (conn != null) {
						conn.close();
						conn = null;
					}
				} catch (SQLException e) {
					System.out.println("Connection关闭失败:" + e.getMessage());
				}
			}
		}
	}

}

>>>>>>>>>> (单例模式)JdbcUtilsSing.java <<<<<<<<<<

package com.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 数据库工具类<br />
 * 单例模式
 * 
 * @author MY
 * @version 1.0, 2011-03-03
 * 
 */
public final class JdbcUtilsSing {

	private String url = "jdbc:mysql:///jdbc";
	private String username = "root";
	private String password = "";

	private static JdbcUtilsSing instance = null;

	private JdbcUtilsSing() {

	}

	public static JdbcUtilsSing getInstance() {
		if (instance == null) {
			synchronized (JdbcUtilsSing.class) {
				if (instance == null) {
					instance = new JdbcUtilsSing();
				}
			}
		}
		return instance;
	}

	static {
		try {
			// 1、注册驱动
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	/**
	 * 得到数据库连接
	 * 
	 * @return
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, username, password);
	}

	/**
	 * 关闭数据库资源
	 * 
	 * @param rs
	 * @param stmt
	 * @param conn
	 */
	public void free(ResultSet rs, Statement stmt, Connection conn) {
		try {
			if (rs != null) {
				rs.close();
				rs = null;
			}
		} catch (SQLException e) {
			System.out.println("ResultSet关闭失败:" + e.getMessage());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
					stmt = null;
				}
			} catch (SQLException e) {
				System.out.println("Statement关闭失败:" + e.getMessage());
			} finally {
				try {
					if (conn != null) {
						conn.close();
						conn = null;
					}
				} catch (SQLException e) {
					System.out.println("Connection关闭失败:" + e.getMessage());
				}
			}
		}
	}

}


### 实现 MySQL 数据库云同步方案 #### 选择合适的云平台和服务提供商 为了实现MySQL数据库的云端同步,可以选择主流云计算服务商提供的托管型关系数据库服务(RDS),这些服务通常内置了自动化的备份、恢复以及跨区域复制等功能。例如阿里云、腾讯云、华为云等国内厂商均提供了较为完善的MySQL RDS产品线;国际市场上则有Amazon Web Services(AWS) 的 Amazon RDS for MySQL 和 Aurora MySQL兼容版,Google Cloud Platform(GCP) 上面也有对应的Cloud SQL for MySQL选项[^1]。 #### 配置主从架构下的双向同步机制 当决定采用特定供应商之后,在其平台上创建至少两台实例作为Master-Slave集群成员来构建高可用环境。对于希望达到更高层次的数据冗余保护目的,则可进一步设置成Multi-Master多活模式或者利用Galera Cluster技术达成真正的双写入支持能力。需要注意的是,无论是哪种方式都涉及到网络延迟优化、冲突解决策略等问题,因此建议仔细阅读官方文档并参照最佳实践指南来进行具体实施操作[^2]。 #### 使用中间件工具辅助完成异构系统间的数据迁移与实时更新 如果面临不同品牌之间的互连互通需求——比如把本地数据中心内部署的传统物理机上的MySQL迁移到公有云环境中去,又或者是反过来做反向工程的话,那么借助专业的ETL软件如Talend Open Studio 或者 Pentaho Data Integration (Kettle),甚至是开源项目MaxScale都可以很好地满足这类场景下复杂业务逻辑处理的要求。特别是针对增量变更捕获(CDC)特性而言,它们往往具备更灵活的任务调度能力和更低廉的成本开销优势[^3]。 ```bash # 创建用于测试同步效果的新表结构定义语句 CREATE TABLE `test_sync` ( `id` INT NOT NULL AUTO_INCREMENT, `content` VARCHAR(255), PRIMARY KEY (`id`) ); ``` #### 测试验证整个流程的有效性和稳定性 最后一步也是至关重要的环节就是进行全面详尽的功能性检验工作。这不仅限于简单的DML命令执行情况确认,还包括但不限于DDL变动传播效率评估、事务一致性保障措施审查等方面的内容。只有经过充分的压力测试和边界条件分析过后得出的结果才是值得信赖的依据所在[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值