Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java库为Postgres副本编写二进制格式?_Java_Postgresql - Fatal编程技术网

Java库为Postgres副本编写二进制格式?

Java库为Postgres副本编写二进制格式?,java,postgresql,Java,Postgresql,有没有人遇到过一个Java库(或者只是一些代码)来编写Postgres使用的binary格式 这看起来很简单,但如果有人已经找到了正确的元组数据格式,我还是从这里开始吧 实际上,即使只是描述所有数据类型的格式也会有所帮助 谢谢。您是否考虑过只使用JDBC驱动程序中的?否则,您可能可以从中派生实现。这怎么样?我自己还没有试过这个-你可以试试,它实现了PostgreSQL的二进制复制协议: 它也可以从Maven中央存储库中获得 免责声明:我是项目作者 PostgreSQL二进制复制协议 我不想

有没有人遇到过一个Java库(或者只是一些代码)来编写Postgres使用的
binary
格式

这看起来很简单,但如果有人已经找到了正确的元组数据格式,我还是从这里开始吧

实际上,即使只是描述所有数据类型的格式也会有所帮助


谢谢。

您是否考虑过只使用JDBC驱动程序中的?否则,您可能可以从中派生实现。

这怎么样?我自己还没有试过这个-

你可以试试,它实现了PostgreSQL的二进制复制协议:

它也可以从Maven中央存储库中获得

免责声明:我是项目作者

PostgreSQL二进制复制协议 我不想简单地宣传我的项目,但也写协议

首先,我编写了一个类
PgBinaryWriter
,它包装了一个
DataOutputStream
,并具有写入二进制协议头的方法、一个启动新行的方法(二进制复制协议要求您为要插入的每行写入列数)和一个
write
方法,它使用
IValueHandler
来编写给定的Java类型

PgBinaryWriter
实现了一个可自动关闭的
AutoClosable
,因为在刷新和关闭流之前有必要将
-1
写入流

IValueHandler
接受一个
DataOutputStream
和一个值。它负责用PostgreSQL二进制协议格式写入给定值

PgBinaryWriter
//版权所有(c)Philipp Wagner。版权所有。
//根据麻省理工学院许可证授权。有关完整的许可证信息,请参见项目根目录中的许可证文件。
包de.bytefish.pgbulkinsert.de.bytefish.pgbulkinsert.pgsql;
导入de.bytefish.pgbulkinsert.de.bytefish.pgbulkinsert.exceptions.BinaryWriteFileDexception;
导入de.bytefish.pgbulkinsert.de.bytefish.pgbulkinsert.pgsql.handlers.IValueHandler;
导入java.io.BufferedOutputStream;
导入java.io.DataOutputStream;
导入java.io.OutputStream;
公共类PgBinaryWriter实现自动关闭{
/**用于写入输出的字节缓冲区*/
私有瞬态数据输出流缓冲区;
公共PgBinaryWriter(){
}
公开作废打开(最终输出流输出){
buffer=新的DataOutputStream(新的BufferedOutputStream(out));
writeHeader();
}
私有无效写头(){
试一试{
//标题需要11字节
buffer.writeBytes(“PGCOPY\n\377\r\n\0”);
//32位整数,表示没有OID
buffer.writeInt(0);
//32位报头扩展区长度
buffer.writeInt(0);
}捕获(例外e){
抛出新的BinaryWriteFileDexception(e);
}
}
公共无效startRow(整数列){
试一试{
buffer.writeShort(numColumns);
}捕获(例外e){
抛出新的BinaryWriteFileDexception(e);
}
}
public void write(最终IValueHandler处理程序,最终TTargetType值){
handler.handle(缓冲区、值);
}
@凌驾
公众假期结束(){
试一试{
缓冲区写入端口(-1);
buffer.flush();
buffer.close();
}捕获(例外e){
抛出新的BinaryWriteFileDexception(e);
}
}
}
ValueHandler
IValueHandler
是一个简单的接口,它有一个
handle
方法来获取
DataOutputStream
和一个值

//版权所有(c)Philipp Wagner。版权所有。
//根据麻省理工学院许可证授权。有关完整的许可证信息,请参见项目根目录中的许可证文件。
包de.bytefish.pgbulkinsert.de.bytefish.pgbulkinsert.pgsql.handlers;
导入java.io.DataOutputStream;
导入java.lang.reflect.Type;
公共接口IValueHandler扩展了ValueHandler{
无效句柄(DataOutputStream缓冲区,最终TTargetType值);
类型getTargetType();
}
了解协议很重要,当值为null时,必须编写
-1
。为此,我编写了一个抽象基类,用于处理这个案例

//版权所有(c)Philipp Wagner。版权所有。
//根据麻省理工学院许可证授权。有关完整的许可证信息,请参见项目根目录中的许可证文件。
包de.bytefish.pgbulkinsert.de.bytefish.pgbulkinsert.pgsql.handlers;
导入de.bytefish.pgbulkinsert.de.bytefish.pgbulkinsert.exceptions.BinaryWriteFileDexception;
导入java.io.DataOutputStream;
公共抽象类BaseValueHandler实现了IValueHandler{
@凌驾
公共无效句柄(DataOutputStream缓冲区,最终T值){
试一试{
如果(值==null){
buffer.writeInt(-1);
返回;
}
内部句柄(缓冲区、值);
}捕获(例外e){
抛出新的BinaryWriteFileDexception(e);
}
}
受保护的抽象void internalHandle(DataOutputStream缓冲区,最终T值)引发异常;
}
然后可以实现各种Java类型的处理程序。下面是
long
的示例。你可以找到 GitHub存储库()中的其他实现

//版权所有(c)Philipp Wagner。版权所有。
//根据麻省理工学院许可证授权。有关完整的许可证信息,请参见项目根目录中的许可证文件。
包de.bytefish.pgbulkinsert.de.bytefish.pgbulkinsert.pgsql.handlers;
导入java.io.DataOutputStream;
导入java.lang.reflect.Type;
公共类LongValueHandler扩展了BaseValueHandler{
@凌驾
受保护的void internalHandle(DataOutputStream缓冲区,最终长值)引发异常{
缓冲区写入(8);
buffer.writeLong(值);
}
@凌驾
公共类型getTargetType(){