Voir A. Milen commentaire de Radev. Cela aurait dû être une réponse. Vous ne devez pas autoriser les lignes vides.
Sûrement qu'au moins une colonne peut avoir une contrainte qui provoquerait l'échec de l'insertion. Ensuite, votre application peut imprimer/enregistrer l'erreur avec suffisamment de diagnostics pour vous permettre de comprendre ce qui se passe, et dans quelles conditions. Sans modification ultérieure de ce qui précède, déterminez si toutes les données de votre file d'attente ont été insérées correctement ou si certaines lignes sont manquantes. C'est-à-dire, voir si certaines lignes sont en train d'être traduites en inserts vides. Si vous voyez que certaines données provoquent cela, vous pouvez trouver ce que les données de problème ont en commun.
Utilisez-vous des insertions paramétrées et préparées, ou créez-vous une chaîne d'instructions d'insertion SQL à chaque fois et exécutez-la? Si vous construisez des chaînes SQL à exécuter, alors vous devez assurez-vous de citer correctement les colonnes de caractères/chaînes binaires avec les routines fournies par libpq. Ou passez à l'autre méthode de préparation de l'insertion et de transmission des données en tant que paramètres où elle peut être correctement citée par libpq elle-même. Cela peut également améliorer les performances.
Ajoutez une contrainte de vérification à votre table, le cas échéant, et attendez l'erreur (inévitable) de la base de données. –
Est-ce multi-thread? Utilisez-vous des appels pg asynchrones? Est-ce que vous réutilisez vos tampons d'entrée? –