7
votes

Java Bibliothèque pour écrire un format binaire pour la copie des postgres?

Est-ce que quelqu'un rencontre une bibliothèque Java (ou juste un code) pour écrire le format binaire utilisé par Postgres ' commande copie ?

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.

En fait, même la description des formats pour tous les types de données serait utile.

Merci.


0 commentaires

3 Réponses :


2
votes

Avez-vous envisagé simplement d'utiliser le copyManager du pilote JDBC? Sinon, vous pouvez probablement dériver la mise en œuvre à partir du < Code> QueryExecutorImpl .


4 commentaires

Ma compréhension est que copyManager 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 ), 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 () serait sortie 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?



1
votes

9
votes

Vous pouvez essayer pgbulkinsert , qui implémente le protocole de copie binaire de PostgreSQL:

  • https://github.com/bytefish/pgbulkinsert li> ul>

    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 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 code> pour écrire un type Java donné. p>

    Le 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>

    Le ItivalueHandler code> prend un code> Code> DataOutPutStream code> et une valeur. Il est responsable de la rédaction de la valeur donnée avec le format de protocole binaire postgreSQL. P>

    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;
    }
    


0 commentaires