Java 我想使用JDBI将11000条记录插入1000个数据块中,这样所有记录都应该保持或根本没有记录

Java 我想使用JDBI将11000条记录插入1000个数据块中,这样所有记录都应该保持或根本没有记录,java,postgresql,jdbi,Java,Postgresql,Jdbi,我的代码是 Class Employee { @ColumnName("empid") public int empid; @ColumnName("empname") public String empname; @ColumnName("experience") public int experience; } 然后 List lstEmployee=new ArrayList(); 对于(int i=1;i

我的代码是

Class Employee
{
    @ColumnName("empid")
    public int empid;

    @ColumnName("empname")
    public String empname;

    @ColumnName("experience")
    public int experience;

}
然后

List lstEmployee=new ArrayList();
对于(int i=1;i<10000;i++){
添加(新员工(i,“abcazsa”,i));
}
UserDAOImpl obj=newuserdaoimpl(newjdbihelper().getDBI());
对象插入记录(员工);

@BatchChunkSize(1000)
int insertRecords(@BindBeanList(propertyNames = {"empid", "empname", "experience"}, value = "values") List<Employee> lstEmp);
@BatchChunkSize(1000)
int insertRecords(@BindBeanList(propertyNames={“empid”、“empname”、“experience”},value=“values”)列表lstEmp);
最后

public int insertrecords(List<Employee> lstEmp)
    {
        int cnt = 0;
        try (Handle open = jdbi.open()) {
            UserDAO attach = open.attach(UserDAO.class);
        }
        catch(Exception e)
        {
            throw e;

        }

        System.out.println("After catch");
        return cnt;
    }
}
public int insertrecords(列表lstEmp)
{
int-cnt=0;
try(Handle open=jdbi.open()){
UserDAO-attach=open.attach(UserDAO.class);
}
捕获(例外e)
{
投掷e;
}
System.out.println(“捕获后”);
返回cnt;
}
}
线程“main”org.jdbi.v3.core.statement.UnableToExecuteStatementException:org.postgresql.util.PSQLException:发送到后端时发生I/O错误。[语句:“插入公共。“员工”(empid,empname,experience)值”,重写为:“插入公共。“员工”(empid,empname,experience)值(:_值_0_empid,:_值_0_empname,: 查找器:[]] 位于org.jdbi.v3.core.statement.SqlStatement.internalExecute(SqlStatement.java:1464) 位于org.jdbi.v3.core.result.ResultProducers.lambda$returningUpdateCount$0(ResultProducers.java:39) 位于org.jdbi.v3.core.statement.Update.execute(Update.java:53) 位于org.jdbi.v3.core.statement.Update.execute(Update.java:41) 位于org.jdbi.v3.sqlobject.statement.internal.SqlUpdateHandler.lambda$new$1(SqlUpdateHandler.java:59) 位于org.jdbi.v3.sqlobject.statement.internal.SqlUpdateHandler.lambda$configureReturner$3(SqlUpdateHandler.java:74) 位于org.jdbi.v3.sqlobject.statement.internal.CustomizationStatementHandler.invoke(CustomizationStatementHandler.java:157) 位于org.jdbi.v3.sqlobject.statement.internal.SqlUpdateHandler.invoke(SqlUpdateHandler.java:30) 位于org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$null$13(SqlObjectFactory.java:162) 位于org.jdbi.v3.core.ConstantHandleSupplier.invokeInContext(ConstantHandleSupplier.java:52) 位于org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$createInvocationHandler$14(SqlObjectFactory.java:161) 位于com.sun.proxy.$Proxy11.insertRecords(未知源) 位于com.samples.UserDAOImpl.insertrecords(UserDAOImpl.java:48) 位于com.samples.BulkInsert.main(BulkInsert.java:28) 抑制:org.jdbi.v3.core.transaction.TransactionException:无法测试事务状态 位于org.jdbi.v3.core.transaction.LocalTransactionHandler.isInTransaction(LocalTransactionHandler.java:134) 位于org.jdbi.v3.core.Handle.isInTransaction(Handle.java:259) 位于org.jdbi.v3.core.Handle.close(Handle.java:123) 位于com.samples.UserDAOImpl.insertrecords(UserDAOImpl.java:57) …还有一个 原因:org.postgresql.util.PSQLException:此连接已关闭。 位于org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:767) 位于org.postgresql.jdbc.PgConnection.getAutoCommit(PgConnection.java:728) 位于org.jdbi.v3.core.transaction.LocalTransactionHandler.isInTransaction(LocalTransactionHandler.java:131) …还有4个 原因:org.postgresql.util.psqleException:发送到后端时发生I/O错误。 位于org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:333) 位于org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) 位于org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) 位于org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:155) 位于org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:144) 位于org.jdbi.v3.core.statement.SqlStatement.internalExecute(SqlStatement.java:1451) …还有13个 原因:java.io.IOException:尝试将超出范围的整数作为2字节值发送:32997 位于org.postgresql.core.PGStream.sendInteger2(PGStream.java:224) 位于org.postgresql.core.v3.QueryExecutorImpl.sendprasse(QueryExecutorImpl.java:1440) 位于org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1762) 位于org.postgresql.core.v3.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1326) 位于org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:298) …还有18个
它通过使用事务处理来解决

代码如下所示

public int insertrecords(List<Employee> lstEmp) {
    int cnt = 0;
    Handle open = null;
    try {
        open = jdbi.open();
        open.begin();
        UserDAO attach = open.attach(UserDAO.class);
        System.out.println("Start");

        while (true) {
            List<Employee> lstTemp = lstEmp.stream()
                    .limit(3000).collect(Collectors.toList());
            int tempcnt = attach.insertRecords(lstTemp);
            lstEmp.removeAll(lstTemp);
            cnt = cnt + tempcnt;
            if (lstEmp.isEmpty()) {
                break;
            }
        }

        if (open != null && open.isInTransaction()) {
            System.out.println("Commit");
            open.commit();
        }
        System.out.println(cnt);
        System.out.println("End");
    } catch (Exception e) {
        if (open != null) {
            open.rollback();
        }
        throw e;
    }
    return cnt;
}
public int insertrecords(列表lstEmp){
int-cnt=0;
句柄打开=空;
试一试{
open=jdbi.open();
open.begin();
UserDAO-attach=open.attach(UserDAO.class);
系统输出打印项次(“开始”);
while(true){
列表lstEmp=lstEmp.stream()
.limit(3000).collect(collector.toList());
int tempcnt=attach.insertRecords(lstemp);
lstEmp.removeAll(lstEmp);
cnt=cnt+tempcnt;
if(lstEmp.isEmpty()){
打破
}
}
if(open!=null&&open.isInTransaction(){
System.out.println(“提交”);
open.commit();
}
系统输出打印项次(cnt);
系统输出打印项次(“结束”);
}捕获(例外e){
如果(打开!=null){
open.rollback();
}
投掷e;
}
返回cnt;
}
public int insertrecords(List<Employee> lstEmp) {
    int cnt = 0;
    Handle open = null;
    try {
        open = jdbi.open();
        open.begin();
        UserDAO attach = open.attach(UserDAO.class);
        System.out.println("Start");

        while (true) {
            List<Employee> lstTemp = lstEmp.stream()
                    .limit(3000).collect(Collectors.toList());
            int tempcnt = attach.insertRecords(lstTemp);
            lstEmp.removeAll(lstTemp);
            cnt = cnt + tempcnt;
            if (lstEmp.isEmpty()) {
                break;
            }
        }

        if (open != null && open.isInTransaction()) {
            System.out.println("Commit");
            open.commit();
        }
        System.out.println(cnt);
        System.out.println("End");
    } catch (Exception e) {
        if (open != null) {
            open.rollback();
        }
        throw e;
    }
    return cnt;
}