冬眠+;mariadb java客户端+;重写BatchedStatements后出现mysql语法错误=true
我想通过批处理插入来提高性能。基于internet,我需要将rewriteBatchedStatements=true作为连接字符串的一部分。没有这些,一切都很好,但在添加这些之后,我会出现错误 (下面是错误,从日志中删除了表/字段名,其中一个是'value',因为我正在调试,如果原因是保留字,另一个是'id',其他不是保留字) 我已经试过使用hibernate.dialen作为org.hibernate.dialen.mysqldialen/mysql5dialen/mysql5innodbdialen。不确定下一步要尝试什么,因此提出了这个问题 原因:org.mariadb.jdbc.internal.util.dao.QueryException:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行使用接近“值”(2,'2016-01-21 16:18:42.82','2016-01-21 16:18:42.82',2157838336,NULL',的正确语法 查询是: 在TABLENAME(字段1、字段2、字段3、字段4、字段5、字段6)中插入值(?、、?、?、?、?、?、?)、参数:[1、'2016-01-21 16:18:42.817'、'2016-01-21 16:18:42.817',2157838336、NULL、223678] 在org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:475)~[mariadb-java-client-1.3.4.jar:?] 在org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.result(AbstractQueryProtocol.java:396)~[mariadb-java-client-1.3.4.jar:?] 在org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:360)~[mariadb-java-client-1.3.4.jar:?] 在org.mariadb.jdbc.MariaDbStatement.execute(MariaDbStatement.java:320)~[mariadb-java-client-1.3.4.jar:?] 在org.mariadb.jdbc.MariaDbStatement.executeBatch(MariaDbStatement.java:1236)~[mariadb-java-client-1.3.4.jar:?] 在com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:2544)~[c3p0-0.9.5.1.jar:0.9.5.1] 在org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(BatchingBatch.java:127)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.engine.jdbc.batch.internal.BatchingBatch.doExecuteBatch(BatchingBatch.java:114)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.execute(AbstractBatchImpl.java:163)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.engine.jdbc.internal.jdbcoordinatorimpl.executeBatch(jdbcoordinatorimpl.java:226)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:484)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final] …还有9个 版本: hibernate 4.3.11.Final,C3P00.9.5.1,mariadb java客户端1.3.4,mysql 5.6.21 编辑:哈!通过在AbstractQueryProtocol中设置断点并在堆栈跟踪的前面检查MasterProtocol中的queriesObj字段,我能够看到完整的查询。我将分析它们,可能错误更有意义,因为现在我看到了所有插入 EDIT2:嗯,当插入在查询数组中时,我觉得它们是正常的。不确定mariadb java client org.mariadb.jdbc.internal.packet.send.SendTextQueryPacket第120行->的这部分是否有错误冬眠+;mariadb java客户端+;重写BatchedStatements后出现mysql语法错误=true,java,mysql,hibernate,mariadb,Java,Mysql,Hibernate,Mariadb,我想通过批处理插入来提高性能。基于internet,我需要将rewriteBatchedStatements=true作为连接字符串的一部分。没有这些,一切都很好,但在添加这些之后,我会出现错误 (下面是错误,从日志中删除了表/字段名,其中一个是'value',因为我正在调试,如果原因是保留字,另一个是'id',其他不是保留字) 我已经试过使用hibernate.dialen作为org.hibernate.dialen.mysqldialen/mysql5dialen/mysql5innodbd
queries.get(0).writeFirstRewritePart(stream);
int lastPartLength = queries.get(0).writeLastRewritePartLength();
for (int i = 1; i < queries.size(); i++) {
if (pos.checkRewritableLength(queries.get(i).writeToRewritablePartLength(rewriteOffset) + lastPartLength)) {
queries.get(i).writeToRewritablePart(stream, rewriteOffset);
queryNumberSend++;
}
}
queries.get(0).writeLastRewritePart(stream);
querys.get(0.WriteFirstRetWritePart(流);
int lastPartLength=querys.get(0.WriteLastTreWritePartLength();
对于(int i=1;i
EDIT3:使用调试信息构建了自己的mariadb客户端,看起来查询是:
在TABLENAME(字段1、字段2、字段3、字段4、字段5、字段6)中插入值(6个值),(字段1、字段2、字段3、字段4、字段5、字段6)值(其他6个值),(字段1、字段2、字段3、字段4、字段5、字段6)值(6个值),依此类推。。
据我所知,正确的形式是
插入TABLENAME(字段1、字段2、字段3、字段4、字段5、字段6)值(6个值),(另一组值),(另一组值)
插入tbl(a、b)值(1,2),(4,5),(7,8),…
--不要重复列名列表。我知道这一点。X插入是由hibernate生成的,当rewriteBatchedStatements=true在连接字符串中时,mariadb jdbc驱动程序应该将X插入合并为您描述的插入,但似乎它没有这样做。抱歉,第三方软件会这样做