Est-ce que quelqu'un rencontre une bibliothèque Java (ou juste un code) pour écrire le format code> binaire > utilisé par Postgres ' commande copie ? p>
Il semble très simple, mais si quelqu'un a déjà compris le format de données de tuple correct, je commence tout aussi bien là-bas. P>
En fait, même la description des formats pour tous les types de données serait utile. p>
Merci. P>
3 Réponses :
Avez-vous envisagé simplement d'utiliser le copyManager Code> du pilote JDBC? Sinon, vous pouvez probablement dériver la mise en œuvre à partir du < Code> QueryExecutorImpl code> . P>
Ma compréhension est que copyManager code> ne redirige que les flux d'entrée / sortie, il nécessite toujours des données correctement formatées à la charge, non? Dans tous les cas, je dois être capable de générer les fichiers de charge en vrac sans connexion JDBC.
La mise en œuvre du pilote est utile, mais à la recherche du codage réel, je ne peux trouver que la mise en œuvre des primitives, des tableaux d'octets et des chaînes (dans pgstream code>), qui sont assez évidentes. Pouvez-vous me signaler là où il gère des types plus complexes (temps / date, tableaux, types d'utilisateurs, etc.)?
@Dmitri: copymanager.copyout () code> serait sortie i> les données binaires (de la base de données). Si vos données ne sont pas encore à l'intérieur d'une table, cela ne vous aiderait pas bien sûr.
Timestamputils.Totimebin (), .todatebin (), .Totimestampbin () Décrivez les formats de date, en quelque sorte, avec beaucoup de conditionnels. Le code C dans Utils / Backend / ADT / TIMESTAMP.C est donc dépendant des options de compilation, j'ai peur de toucher ce format binaire avec un pôle de 10 pieds. Avez-vous trouvé quelque chose d'utile dans vos voyages?
à quoi ça se passe? Je n'ai pas essayé moi-même - https : //github.com/uwescience/myria/blob/master/src/edu/washington/escience/myria/postgresbinyTuplewriter.java p>
Vous pouvez essayer pgbulkinsert , qui implémente le protocole de copie binaire de PostgreSQL:
Il est également disponible auprès du référentiel central Maven. p>
Je ne veux pas simplement annoncer mon projet, mais écrire sur le protocole. P>
Tout d'abord j'ai écrit une classe Le Le pgbinarinwriter code>, qui enveloppe un dataOutputStream et contient des méthodes d'écriture de l'en-tête de protocole binaire, une méthode pour démarrer une nouvelle ligne (le protocole de copie binaire nécessite d'écrire le nombre de colonnes pour chaque ligne que vous allez insérer) et un écrire Code> Méthode, qui prend un ItivalueHandler pgbanarinwriter code> implémente un autoclosable code >, parce qu'il est nécessaire d'écrire un -1 code> au flux avant de rincer et de fermer le flux. p> ItivalueHandler PGBARENWRITRER H2>
@Test
public void bulkInsertPersonDataTest() throws SQLException {
// Create a large list of Persons:
List<Person> persons = getPersonList(100000);
// Create the BulkInserter:
PersonBulkInserter personBulkInserter = new PersonBulkInserter();
// Now save all entities of a given stream:
personBulkInserter.saveAll(PostgreSqlUtils.getPGConnection(connection), persons.stream());
// And assert all have been written to the database:
Assert.assertEquals(100000, getRowCount());
}
private List<Person> getPersonList(int numPersons) {
List<Person> persons = new ArrayList<>();
for (int pos = 0; pos < numPersons; pos++) {
Person p = new Person();
p.setFirstName("Philipp");
p.setLastName("Wagner");
p.setBirthDate(LocalDate.of(1986, 5, 12));
persons.add(p);
}
return persons;
}