如题,看了Wiki里的【配置_DruidDataSource参考配置】,上面说如果使用mysql数据库,属性poolPreparedStatements可以设置成false,想知道为什么mysql建议设置成false,设成true不是可以通过缓存提高数据查询的性能吗,难道有其他什么弊端,跪求诸位大佬解惑
pdtvr36n1#
客户端会占据内存
uubf1zoe2#
我觉得他想问的是为什么不设置为true。
eqoofvh93#
@wenshao,客户端会占据内存,是指我们的应用服务器会占据内存吗?占用的多吗,如果我们的机器内存完全够用,是不是就可以设成true了?
r1zhe5dt4#
poolPreparedStatements这里缓存的是PreparedStatement,mysql-jdbc里已经提供参数cachePrepStmts和useServerPrepStmts设置PreparedStatement的缓存,所以这里这里就不用再缓存了,否则纯属浪费内存。至于为什么oracle需要,我就不太清楚了,有了解oracle驱动的可以说一下。
vcudknz35#
@Rembau 目前MySQL 5.7是支持游标的。mysql-jdbc里面的cachePrepStmts和useServerPrepStmts参数默认也是不打开的。那是不是就意味着当前是需要打开poolPreparedStatements选项的?
of1yzvn46#
我有一个批量插入的操作,后来发现插着插着内存溢出了,结果就是这个缓存了SQL语句把内存占了
7xzttuei7#
该参数设置为true的情况下,最近遇到过一个情况,批量插入时,若第一次插入异常回滚了,第二次插入时,会将上一次没成功的数据一起执行了。发现是回滚的时候 com.mysql.cj.AbstractQuery 的 batchedArgs 没有清除导致的。将该参数设置为false的话,每次都是一个新的statement,就不会出现这个问题了。
7条答案
按热度按时间pdtvr36n1#
客户端会占据内存
uubf1zoe2#
我觉得他想问的是为什么不设置为true。
eqoofvh93#
@wenshao,客户端会占据内存,是指我们的应用服务器会占据内存吗?占用的多吗,如果我们的机器内存完全够用,是不是就可以设成true了?
r1zhe5dt4#
poolPreparedStatements这里缓存的是PreparedStatement,mysql-jdbc里已经提供参数cachePrepStmts和useServerPrepStmts设置PreparedStatement的缓存,所以这里这里就不用再缓存了,否则纯属浪费内存。至于为什么oracle需要,我就不太清楚了,有了解oracle驱动的可以说一下。
vcudknz35#
@Rembau 目前MySQL 5.7是支持游标的。mysql-jdbc里面的cachePrepStmts和useServerPrepStmts参数默认也是不打开的。那是不是就意味着当前是需要打开poolPreparedStatements选项的?
of1yzvn46#
我有一个批量插入的操作,后来发现插着插着内存溢出了,结果就是这个缓存了SQL语句把内存占了
7xzttuei7#
该参数设置为true的情况下,最近遇到过一个情况,批量插入时,若第一次插入异常回滚了,第二次插入时,会将上一次没成功的数据一起执行了。发现是回滚的时候 com.mysql.cj.AbstractQuery 的 batchedArgs 没有清除导致的。将该参数设置为false的话,每次都是一个新的statement,就不会出现这个问题了。