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