一,FetchSize。默认fetchsize是10行,如果查询结果包括100行,应用与数据库之间会有10次网络交互。但是如果FetchSize设置很大,可能会导致OutOfMemoryError
PreparedStatement.setFetchSize(100);
JdbcTemplate.setFetchSize(100);
二,Statement VS PreparedStatement VS CallableStatement
- Statement 用于单次查询,
- PreparedStatement 用于参数化,动态SQL查询。可用于查询多次。当使用多次查询时,性能优于Statement。
- CallableStatement 用于执行存储过程。
三,更新多条数据可以使用batch,仅需两次网络交互,一次用于创建PreparedStatement,一次用于提交数据更新。
四,尽量不要查询数据库元数据。查询元数据很慢,SELECT语句通常需要两次网络交互,一次用于元数据,一次用于查询结果集。
五,不要使用getObject方法,尽量使用getInt,getString等具体方法。getObject方法需要JDBC额外的处理来检测数据类型。
六,使用列索引,而不是列名查询。例如getInt(1), getString(),不要使用getString(‘name’)。因为使用列名查询需要JDBC将列名转化成大写,然后和所有结果集中的列名比较。
七,数据库提交模式。默认为自动提交模式,这种模式下,JDBC会为每次SQL操作,发送一次提交请求给数据库。这就需要一次网络交互,就算执行的是SELECT。如果关闭自动提交,事务执行时间可能会过长,事务会长时间占用数据行的锁,影响其他事务访问这些数据行,从而影响并发性。
八,优化事务隔离界别,优化数据库连接池