我一直在尝试使用spring 3.0 SimpleJdbcTemplate,它需要5分钟来插入1500条记录,而它需要几秒钟 . 使用直接JDBC插入 . 不确定我做错了什么 .
一些值得检查的事情:
开销可能是Spring在应用程序级别管理的事务 . 查看您正在使用的事务管理器类型(查找名为 transactionManager 的bean) . 如果您正在使用JTA,那么使用JDBC快速的瓶颈似乎并不是数据库 .
transactionManager
根据您的应用程序使用该事务的方式,它可能会在完成所有1500个请求和提交之前将所有内容保存在内存中 . 你是否看到内存使用量有很大差异(Spring应该高很多)?
在任何一种情况下,您使用什么类型的数据库连接池?
快速了解您的应用的方式:
获取 pid - "jps -l"
pid - "jps -l"
内存: jmap -histo PID (检查是否存在某种形式的内存泄漏)
jmap -histo PID
检查引擎盖下发生了什么: jstack PID (查找慢速或递归方法调用)
jstack PID
如何使用
jdbcTemplate.batchUpdate(new String[]{sql});
如果您正在构建批处理,请考虑使用具有适当块大小设置的Spring批处理_ JdbcBatchItemWriter ,这将在不到一秒的时间内加载这1500条记录 .
JdbcBatchItemWriter
3 回答
一些值得检查的事情:
开销可能是Spring在应用程序级别管理的事务 . 查看您正在使用的事务管理器类型(查找名为
transactionManager
的bean) . 如果您正在使用JTA,那么使用JDBC快速的瓶颈似乎并不是数据库 .根据您的应用程序使用该事务的方式,它可能会在完成所有1500个请求和提交之前将所有内容保存在内存中 . 你是否看到内存使用量有很大差异(Spring应该高很多)?
在任何一种情况下,您使用什么类型的数据库连接池?
快速了解您的应用的方式:
获取
pid - "jps -l"
内存:
jmap -histo PID
(检查是否存在某种形式的内存泄漏)检查引擎盖下发生了什么:
jstack PID
(查找慢速或递归方法调用)如何使用
如果您正在构建批处理,请考虑使用具有适当块大小设置的Spring批处理_
JdbcBatchItemWriter
,这将在不到一秒的时间内加载这1500条记录 .