与JDBC到MySQL的持久连接

roo*_*ook 13 java mysql jdbc

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

Bal*_*usC 19

在一段时间内保持连接打开是一种不好的做法.当DB打开很长时间时,DB会强制关闭.您应该编写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"); 
Run Code Online (Sandbox Code Playgroud)

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

Connection connection = null;
// ...

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

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

DataSource dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/YourDataSourceName");
Run Code Online (Sandbox Code Playgroud)

  • @EB:它是线程安全的.相关:http://stackoverflow.com/q/9428573您应该为每个线程和事务使用一个完全独立的连接.它们可以保持打开状态,并在完成线程本地事务性工作后重用,但这已经完全是连接池的作用.连接池没有物理关闭连接,只是保持打开并在发布之前对其进行测试(如本文中已经回答的那样) (3认同)