工作中,遇到把大对象写入Postgresql数据库中

package com.geni_sage.gdme.cws.dic;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.ShortBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap; import com.geni_sage.gdme.cws.kuromoji.dict.CharacterDefinition;
import com.geni_sage.gdme.cws.kuromoji.dict.ConnectionCosts;
import com.geni_sage.gdme.cws.kuromoji.dict.Dictionaries;
import com.geni_sage.gdme.cws.kuromoji.dict.TokenInfoDictionary;
import com.geni_sage.gdme.cws.kuromoji.dict.UnknownDictionary;
import com.geni_sage.gdme.cws.kuromoji.trie.DoubleArrayTrie; /**
* 将日语词典写入维护库
*
* @author ywf
*
*/
public class WriteObj2DBTest {
static String pathname = "D:\\yuwenfeng\\T_Miner_TextMing\\gdme\\gdm_agent_start\\mode\\segmentdic\\japanesedic";
static String[] dictionaries = { "tid.dat", "tid_map.dat", "unk.dat",
"unk_map.dat", "cd.dat", "cc.dat", "dat.dat" }; /**
* @param args
* @throws ClassNotFoundException
* @throws IOException
*/
public static void main(String[] args) throws IOException,
ClassNotFoundException {
String driver = "org.postgresql.Driver";
String url = "jdbc:postgresql://127.0.0.1:42856/GDM";
String user = "gsdba";
String password = "gsdba";
if (args.length == 4) {
driver = args[0];
url = args[1];
user = args[2];
password = args[3];
}
try {
Class.forName(driver);
} catch (ClassNotFoundException e1) {
System.err.println("链接驱动失败");
}
Connection con = null;
try {
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e1) {
System.err.println("创建连接失败");
}
try {
createTable(con);
write2db(con, dictionaries);
// readfromdb(con, "gs_japanesedic", "tid.dat");
// readfromdb(con, "gs_japanesedic", "tid_map.dat");
// readfromdb(con, "gs_japanesedic", "unk.dat");
// readfromdb(con, "gs_japanesedic", "unk_map.dat");
// readfromdb(con, "gs_japanesedic", "cd.dat");
// readfromdb(con, "gs_japanesedic", "cc.dat");
// readfromdb(con, "gs_japanesedic", "dat.dat");
con.close();
} catch (SQLException e1) {
e1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 建立日语词典表
*
* @param con
* @throws SQLException
*/
private static void createTable(Connection con) throws SQLException {
String sql = "create table gs_japanesedic(dictype varchar(100),japaninfo bytea)";
Statement stmt = con.createStatement();
stmt.execute(sql);
stmt.close();
} /**
* 把流写入维护库
*
* @param con
* @param path
* @param dicname
* @throws Exception
*/
private static void write2db(Connection con, String[] path)
throws Exception {
CharacterDefinition characterDefinition = UnknownDictionary
.getInstance(pathname).getCharacterDefinition();
short[][] cost = ConnectionCosts.getInstance(pathname).getCosts();
String sql = "insert into gs_japanesedic values(?,?)";
PreparedStatement pstmt = con.prepareStatement(sql);
for (int i = 0; i < path.length; i++) {
pstmt.setString(1, path[i]);
byte[] by = null;
if (path[i].equals("cd.dat") || path[i].equals("cc.dat")) {
if (path[i].startsWith("cd")) {// CharacterDefinition
by = getBytes(characterDefinition);
} else {
by = getBytes(cost);// cost
}
} else {
InputStream input = new FileInputStream(pathname + "/"
+ path[i]);
by = getbytes(input);
}
pstmt.setBytes(2, by);
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
} /**
* convet inputstream into byte[]
*
* @param input
* @return
* @throws IOException
*/
private static byte[] getbytes(InputStream input) throws IOException {
byte[] by = new byte[input.available()];
input.read(by);
return by;
} public static DoubleArrayTrie readtrie(InputStream is) throws IOException {
DoubleArrayTrie trie = new DoubleArrayTrie();
DataInputStream dis = new DataInputStream(new BufferedInputStream(is));
int baseCheckSize = dis.readInt();
int tailSize = dis.readInt();
ReadableByteChannel channel = Channels.newChannel(dis); ByteBuffer tmpBaseBuffer = ByteBuffer.allocateDirect(baseCheckSize * 4);
channel.read(tmpBaseBuffer);
tmpBaseBuffer.rewind();
tmpBaseBuffer.asIntBuffer().asReadOnlyBuffer(); ByteBuffer tmpCheckBuffer = ByteBuffer
.allocateDirect(baseCheckSize * 4);
channel.read(tmpCheckBuffer);
tmpCheckBuffer.rewind();
tmpCheckBuffer.asIntBuffer().asReadOnlyBuffer(); ByteBuffer tmpTailBuffer = ByteBuffer.allocateDirect(tailSize * 2);
channel.read(tmpTailBuffer);
tmpTailBuffer.rewind();
tmpTailBuffer.asCharBuffer().asReadOnlyBuffer(); is.close();
return trie;
} private static void readfromdb(Connection con, String table, String dictype)
throws SQLException, IOException, ClassNotFoundException {
String sql = "select * from " + table + " where dictype = '" + dictype
+ "'";
PreparedStatement stmt = con.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
String dic = rs.getString(1);
byte[] by = rs.getBytes(2);
InputStream bi = new ByteArrayInputStream(by);
if (dictype.equals("cd.dat") || dictype.equals("cc.dat")) {
if (dictype.startsWith("cd")) {// CharacterDefinition
CharacterDefinition characterDefinition = (CharacterDefinition) loadObject(bi);
} else {
short[][] cost = (short[][]) loadObject(bi);
} } else if (dictype.startsWith("dat")) {
readtrie(bi);
} else if (dictype.equals("tid.dat") || dictype.equals("unk.dat")) {
loadDictionary(bi);
} else {
loadTargetMap(bi);
}
} } protected static void loadDictionary(InputStream is) throws IOException {
DataInputStream dis = new DataInputStream(is);
int size = dis.readInt();
ByteBuffer tmpBuffer = ByteBuffer.allocateDirect(size);
ReadableByteChannel channel = Channels.newChannel(is);
channel.read(tmpBuffer);
is.close();
tmpBuffer.asReadOnlyBuffer();
} protected static void loadTargetMap(InputStream is) throws IOException,
ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(
is));
int[][] targetMap = (int[][]) ois.readObject();
is.close();
} /**
* 根据序列化对象得到byte[]
*
* @param obj
* @return
* @throws IOException
*/
public static byte[] getBytes(Serializable obj) throws IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject(obj);
out.flush();
byte[] bytes = bout.toByteArray();
bout.close();
out.close();
return bytes;
} public static Object getObject(byte[] bytes) throws IOException,
ClassNotFoundException {
ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
ObjectInputStream oi = new ObjectInputStream(bi);
Object obj = oi.readObject();
bi.close();
oi.close();
return obj;
} public static Object loadObject(InputStream in) throws IOException,
ClassNotFoundException {
ObjectInputStream oi = new ObjectInputStream(in);
Object obj = oi.readObject();
in.close();
oi.close();
return obj;
}
}

把对象写入Postgresql中的更多相关文章

  1. Java基础之序列化对象——将对象写入到文件中(SerializeObjects)

    控制台程序. 首先定义一个含有任意不同数据类型域的可序列化类: import java.io.Serializable; public class Junk implements Serializab ...

  2. PostgreSQL中的索引(一)

    引言 这一系列文章主要关注PostgreSQL中的索引. 可以从不同的角度考虑任何主题.我们将讨论那些使用DMBS的应用开发人员感兴趣的事项:有哪些可用的索引:为什么会有这么多不同的索引:以及如何使用 ...

  3. Postgresql中的large object

    1.初识postgresql large object 一位同事在对使用pg_dump备份出来的文件(使用plain格式)进行恢复时,觉得速度非常慢,让我分析一下是什么原因. 我拿到他的.bak文件, ...

  4. PostgreSQL中定时job执行(pgAgent)

    PostgreSQL中定时job执行 业务分析 近期项目需要定期清理数据库中的多余数据,即每月1号删除指定表中一年以上的数据. 初步分析这种定时job可以使用一下两种技术实现: Linux的cront ...

  5. Java基础知识强化之IO流笔记51:IO流练习之 键盘录入学生信息按照总分排序写入文本文件中的案例

    1.  键盘录入学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分排序写入文本文件中 分析:   A:创建学生类   B:创建集合对象      TreeSet<Student>   ...

  6. java中将list、map对象写入文件

    链接地址:http://blog.sina.com.cn/s/blog_4a4f9fb50101p6jv.html     推荐:凤爪女瓜子男怪象该谁反思伦敦房价为什么持续暴涨 × wvqusrtg个 ...

  7. PostgreSQL中JSON、JSONB基本操作符

    PostgreSQL 9.5以上的版本中有了很多方便的操作符,使得操作 JSON 变得非常方便了. 一. -> 和 ->> : -> 表示获取一个JSON数组元素,支持下标值( ...

  8. Java将对象保存到文件中/从文件中读取对象

    1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...

  9. Postgresql中的数据类型大全

    一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字 ...

随机推荐

  1. Some lines about EF Code First migration.

    Some lines about EF Code First migration: 一. 模型设计 1. 遵循EF标准,注意表关系配对 2. 数据模型里尽量把必须的属性和说明都写全 3. EF默认id ...

  2. 从头实现一个koa框架

    koajs是最流行的nodejs后端框架之一,有很多网站都使用koa进行开发,同时社区也涌现出了一大批基于koa封装的企业级框架.然而,在这些亮眼的成绩背后,作为核心引擎的koa代码库本身,却非常的精 ...

  3. Docker(二):Docker的用途

    Docker的优点: 1.Docker容器的启动可以在秒级实现,相比传统虚拟机方式快的多. 2.Docker资源利用率很高,一台主机上可以同时运行数千个Docker容器. 3.容器除了运行其中应用外, ...

  4. 修改手機的 input source 及 charger 及 usb 相關電路後,容易忽略的事項

    input source 及 charger 需要注意, 是否可以在關機的狀況下充電, 當然 開機充電 是一定要的. usb 部分需要注意, 是否可以在沒有電或者是有電的狀況下 download 程式 ...

  5. 转载自——Json.net动态序列化以及对时间格式的处理

    关于我工作中对Json处理的东西 第一:动态序列化类 第二:时间格式处理 通常我们一个类里 可能有十到更多的属性,但是我们序列化通常只需要序列化其中的 三到五个这样的话就会有多余的数据 如果 我只想序 ...

  6. Java IO 学习(三)缓冲IO / 直接IO / 内存映射

    缓冲IO 在介绍缓冲IO之前需要先了解一下常用的机械硬盘的原理与特点 一个机械硬盘中装有多个盘片 每个盘片上有多个同心圆(磁道) 每个同心圆又由多个弧(扇区)组成,每个弧上都记录了等量的数据(比方说5 ...

  7. HDU 4866 Shooting (主席树)

    题目链接  HDU 4866 题意  给定$n$条线段.每条线段平行$x$轴,离x轴的距离为$D$,覆盖的坐标范围为$[L, R]$.   现在有$m$次射击行动,每一次的射击行动可以描述为在横坐标$ ...

  8. Codeforces 912D Fishes (概率&期望,优先队列的应用)

    题目链接 Fishes 题意  在一个$n*m$的矩阵中,随机选择一个$r * r$的区域覆盖. 一开始我们可以在这个$n*m$的矩阵中选择$k$个点标记为$1$. 我们要选择一个最佳的标记策略,使得 ...

  9. 10.1综合强化刷题 Day6

    T1 排序 题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. ...

  10. Topcoder SRM 145 DIV 1

    Bonuses 模拟 题意:给你一个序列,按照百分比排序,再将百分比取整,再把剩余百分比加到最大的那几个. 题解:按照题意模拟就好.