有关spigot插件导入HikariCP外部库与依赖项的问题解决(经验积累)
一、问题解决
遇到的问题 >>https://q.cnblogs.com/q/148520
最后确定原因:由于创建的是普通项目,手动管理外部库时没有正确导入依赖项
借这次问题,我也去弄清了外部库和依赖项的区别
解决方法:
由于开发的是1.8.8插件,而Minecraft Development最低只支持到1.12版本
不过没关系,先随便选择一个版本并创建项目,然后在项目目录下的pom.xml文件里修改所用核心,手动修改为1.8.8
对于Hikari外部依赖也采用同样方法,以4.0.3为例
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
在pom.xml里添加这段语句即可导入Hikari依赖项
再点击加载即可把所需依赖都添加进来
这样你就可以在写代码的过程中导入所需的库,也可以在构建项目时使用maven把依赖自动打包进来。
这里要注意,单独点击构建按钮并不能实现Maven打包,意味着你导入的依赖并不能真正被打包进你的插件,最后在服务端运行起来仍然会报出NoClassfFound类的错误。
正确的做法:
点击侧边栏的Maven
点击生命周期
分别点击clean和package并运行
然后就可以在项目target目录下找到两个jar文件,选择那个不是original开头的jar文件,即可放进服务端运行
二、使用连接池的好处
对于多人服务器,如果不使用连接池,一次请求建立一次连接,或者一个长时间连接来实现多种操作,都会使得服务器不稳定,同时加大了服务器负担,对于MySQL默认8小时无操作自动释放连接的情况,原先的办法显然只能解决燃眉之需,而且服务器容易因连接释放而发生问题。
使用连接池的好处:
1.性能提升: 连接池允许在应用程序启动时创建一组数据库连接,并将它们保存在池中,以便在需要时重复使用。这避免了在每次数据库请求时都建立和断开连接的开销,从而提高了性能。
2.资源管理: 连接池可以限制同时打开的数据库连接的数量,防止应用程序过度使用数据库资源。这对于防止资源泄漏和提高系统的整体可伸缩性非常重要。
3.提高响应速度: 由于连接池中的连接已经建立,可以立即提供给应用程序,而无需等待连接建立的时间。这有助于减少应用程序的响应时间。
4.连接重用: 连接池使得连接可以被多次重复使用,而不是每次都重新创建。这降低了数据库连接的创建和销毁的开销,提高了效率。
5.避免连接超时: 长时间未使用的数据库连接可能会被数据库服务器断开。连接池会定期检查连接的状态并重新激活那些过期但仍然可用的连接,从而避免连接超时问题。
6.动态调整: 一些连接池允许动态调整连接池的大小,以适应应用程序的需求。这使得在高负载时可以增加连接数,而在低负载时可以减少连接数,从而更好地利用资源。
7.能更好的应对高并发状况,大大增强服务器稳定性。
三、建立与释放连接池(前提是装好依赖并正确导入库)
1.导包
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
2.建立连接池
HikariConfig config_D= new HikariConfig();
config_D.setJdbcUrl(url);
config_D.setUsername(username);
config_D.setPassword(password);
HikariDataSource dataSource = new HikariDataSource(config_D);
logger.info("§a连接池已建立");
- 释放连接池
dataSource.close();
- 使用连接池的连接
建议使用try-with-resources语句,这样可以不用显示地调用close来释放连接
try (Connection connection = dataSource.getConnection();//从连接池取出连接
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
//处理语句
//...
} catch (SQLException e) {
e.printStackTrace();
}