与 JDBC 到 MySQL 的持久连接

2022-09-04 08:07:50

我有一个使用JDBC连接到MySQL的应用程序。在某些情况下,JDBC连接处于空闲状态数小时(甚至几天),并且它失去了与MySQL的连接,然后除了尝试执行查询时。最好的解决方案是什么?


答案 1

在未确定的时间内保持连接打开是一种不好的做法。当数据库打开时间过长时,它将强制关闭。您应该编写 JDBC 代码,以便它始终在您获取它们的同一块的块中关闭连接(以及语句和结果集),以防止像这样泄漏资源。finallytry

但是,在每次打嗝时获取连接确实是一项非常昂贵的任务,因此您希望使用连接池。体面的连接池将管理打开,测试,重用和关闭连接本身。但是,这并不意味着您可以更改 JDBC 代码以从不关闭它们。您仍然需要关闭它们,因为这实际上会将基础连接释放回池以供将来重用。

有几个连接池,比如Apache DBCP是单线程的,因此性能很差,C3P0是多线程的,性能更好,而Tomcat JDBC是使用Tomcat的,由于性能不好,它不想使用内置的DBCP。

您可以通过编程方式创建连接池,下面是 C3P0 的示例:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dbname");
dataSource.setUser("username");
dataSource.setPassword("password"); 

在应用程序启动期间执行一次,然后可以按如下方式使用它:

Connection connection = null;
// ...

try {
    connection = dataSource.getConnection();
    // ...
} finally {
    // ...
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

当您在支持JNDI的容器(如servletcontainer(例如Tomcat))中运行时,您也可以将其声明为(此处为Tomcat特定手册)。然后,它将使用 servletcontainer 提供的连接池设施。然后,您可以按如下方式获取数据源:java.sql.DataSource

DataSource dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/YourDataSourceName");

答案 2

有一些库,例如Apache的DBCP,可以进行连接池。其中一部分是,它们可以设置为在您使用连接时自动测试连接(例如“从DUAL中选择NOW()”或其他无害的东西),并在必要时自动透明地重新建立连接,从而允许您的应用程序假装连接是永恒的。


推荐