Web项目使用JDBC连接数据库时抛出AccessControlException权限错误
嘿,遇到这个权限问题别慌,我来帮你捋捋问题根源和解决办法:
这个错误本质是你的Web项目运行在启用了SecurityManager的环境中,MySQL JDBC驱动初始化AbandonedConnectionCleanupThread的时候,需要读取com.mysql.cj.disableAbandonedConnectionCleanup这个系统属性,但当前的安全策略没有授予读取该属性的权限,所以抛出了AccessControlException。
下面是几种可行的解决方案:
调整Java安全策略文件
找到你的JRE或者Web容器对应的安全策略文件(比如JRE目录下的lib/security/java.policy,如果是Tomcat则是conf/catalina.policy),添加如下权限配置:grant { permission java.util.PropertyPermission "com.mysql.cj.disableAbandonedConnectionCleanup", "read"; };配置完成后记得重启你的应用或容器,让策略生效。如果是多应用共享容器,建议修改容器级别的策略文件,避免影响全局JRE的安全配置。
直接禁用废弃连接清理线程
如果你不需要这个线程的功能,可以在项目启动时直接通过JVM参数设置该属性,跳过驱动对属性的读取判断:
在启动命令里添加:-Dcom.mysql.cj.disableAbandonedConnectionCleanup=true比如Tomcat的话,可以在
catalina.sh(Linux)或catalina.bat(Windows)里添加这个JVM参数。谨慎关闭SecurityManager(仅限信任环境)
如果你的应用运行在完全信任的环境中(比如本地测试、内部私有服务器),可以考虑关闭SecurityManager,从根源上避免这类权限限制问题。不过这个操作会降低应用的安全防护级别,生产环境不建议这么做。
备注:内容来源于stack exchange,提问作者Pavan kumar

